Рисование через GdkPixbuf рисует с неправильными координатами пикселей

Это мой текущий код:

static void put_pixel (GdkPixbuf *pixbuf, int x, int y, guchar red, guchar green, guchar blue, guchar alpha)
{
int width, height, rowstride, n_channels;
guchar *pixels, *p;

rowstride = gdk_pixbuf_get_rowstride (pixbuf);
pixels = gdk_pixbuf_get_pixels (pixbuf);

p = pixels + y * rowstride + x * 8;
p[0] = red;
p[1] = green;
p[2] = blue;
p[3] = alpha;
}

int main(int argc, char *argv[] ) {

gtk_init(&argc, &argv);

GtkWidget *window;
GdkColorspace colorspace = GDK_COLORSPACE_RGB;
GdkPixbuf *pixbuf;
GtkWidget *image;

window = gtk_dialog_new();
gtk_widget_set_size_request(window, 512, 512);
g_signal_connect(window, "destroy", G_CALLBACK (G_CALLBACK(gtk_main_quit)), NULL);

pixbuf = gdk_pixbuf_new(colorspace, TRUE, 8, 512, 512);

for(int i=0; i<512; i++) {
put_pixel(pixbuf, i, i, 255, 0, 255, 255);
}

image = gtk_image_new_from_pixbuf(pixbuf);

gtk_box_pack_start(GTK_BOX (GTK_DIALOG(window)->vbox), image, FALSE, FALSE, 0);

gtk_widget_show_all(window);
gtk_main();
}

и я ожидал, что фиолетовая линия от (0, 0) до (512, 512). Вместо этого у меня есть одна фиолетовая линия от (0, 0) до (256, 512) и одна от (256, 0) до (512, 512).

Почему это и как я могу это исправить?

1

Решение

Вы определили переменную, но не использовали ее put_pixel функция)

Решение:

static void put_pixel (GdkPixbuf *pixbuf, int x, int y, guchar red, guchar green, guchar blue, guchar alpha)
{
int width, height, rowstride, n_channels;
guchar *pixels, *p;

rowstride = gdk_pixbuf_get_rowstride (pixbuf);
pixels = gdk_pixbuf_get_pixels (pixbuf);
n_channels = gdk_pixbuf_get_n_channels (pixbuf);

p = pixels + y * rowstride + x * n_channels;
p[0] = red;
p[1] = green;
p[2] = blue;
p[3] = alpha;
}

Вы смещали X на 8 и должны быть 4 (RGBA). Rowstride также коррелирует с количеством каналов, в этом случае высота вашего изображения составляет 512, поэтому 512 * n_channels = 2048.

Заключение:

На put_pixel функция, добавить:

n_channels = gdk_pixbuf_get_n_channels (pixbuf);

и изменить:

p = pixels + y * rowstride + x * 8;

чтобы:

p = pixels + y * rowstride + x * n_channels;
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]