通过GdkPixbuf绘制绘制错误的像素坐标

时间:2017-06-20 17:03:54

标签: c++ gtk gtk2 gdk 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 个答案:

答案 0 :(得分:2)

您定义了变量但未使用它(在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;