Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过GdkPixbuf绘制在错误的像素坐标处_C++_Gtk_Gtk2_Gdk_Gdkpixbuf - Fatal编程技术网

C++ 通过GdkPixbuf绘制在错误的像素坐标处

C++ 通过GdkPixbuf绘制在错误的像素坐标处,c++,gtk,gtk2,gdk,gdkpixbuf,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 = gd

这是我当前的代码:

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();
}
static void put_像素(GdkPixbuf*pixbuf、int x、int y、guchar红、guchar绿、guchar蓝、guchar alpha)
{
整数宽度、高度、行步幅、n_通道;
guchar*像素,*p;
rowstride=gdk_pixbuf_get_rowstride(pixbuf);
像素=gdk_pixbuf_get_像素(pixbuf);
p=像素+y*rowstride+x*8;
p[0]=红色;
p[1]=绿色;
p[2]=蓝色;
p[3]=α;
}
int main(int argc,char*argv[]){
gtk_init(&argc,&argv);
GtkWidget*窗口;
GdkColorspace colorspace=GDK_colorspace_RGB;
GdkPixbuf*pixbuf;
GtkWidget*图像;
window=gtk_dialog_new();
gtk_小部件_设置_大小_请求(窗口,512);
g_信号连接(窗口,“销毁”,g_回调(g_回调(gtk_main_quit)),NULL);
pixbuf=gdk_pixbuf_new(颜色空间,真,8,512,512);
对于(inti=0;ivbox),图像,假,假,0);
gtk_小部件_全部显示(窗口);
gtk_main();
}
我期望得到一条从(0,0)到(512,512)的紫色线。相反,我有一条从(0,0)到(256,512)的紫色线,还有一条从(256,0)到(512,512)的紫色线


这是为什么?我如何修复它?

您定义了变量,但没有使用它(在
put\u 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_通道=2048

结论:

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;
}
put_pixel
功能中,添加:

n_channels = gdk_pixbuf_get_n_channels (pixbuf);
和变化:

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


pixels+y*rowstride+x*8
关联为
pixels+(y*rowstride)+(x*8)
,这可能不是您想要的。@andlabs我从文档中得到的,所以我不完全理解,抱歉!当尝试执行(像素+y)*行跨距时,我得到错误
类型为'guchar*'和'int'的无效操作数转换为二进制'operator*'
?这仍然不正确。想想那个表达想要做什么。其实没关系,我错了
gdk_pixbuf_get_rowstride()
返回字节计数,因此表达式仍然正确。不确定你的情况有什么问题。。。