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()
返回字节计数,因此表达式仍然正确。不确定你的情况有什么问题。。。