使用gdk_draw_rgb_image ()函数绘制rgb图像
原型:
void gdk_draw_rgb_image (GdkDrawable *drawable,
GdkGC *gc,
gint x,
gint y,
gint width,
gint height,
GdkRgbDither dith,
const guchar *rgb_buf,
gint rowstride);
drawable :The GdkDrawable to draw in (usually a GdkWindow).
gc :The graphics context (all GDK drawing operations require one; its contents are ignored).
x :The x coordinate of the top-left corner in the drawable.
y :The y coordinate of the top-left corner in the drawable.
width :The width of the rectangle to be drawn.
height :The height of the rectangle to be drawn.
dith :A GdkRgbDither value, selecting the desired dither mode.
rgb_buf :The pixel data, represented as packed 24-bit data.
rowstride :The number of bytes from the start of one row in rgb_buf to the start of the next.
在可绘制图形中绘制RGB图像。这是GdkRGB的核心函数,可能是您唯一需要使用的函数。
rowstride参数允许更灵活地对齐线。例如,即使矩形的宽度为奇数,也可以将行分配为从32位边界开始。在内存中绘制较大图像的子矩形时,Rowstride也很有用。最后,为了多次复制同一行,允许将rowstride设置为0。
通常,对于0<=i<宽度和0<=j<高度,像素(x+i,y+j)用红色值rgb_buf[j*rowstride+i*3]、绿色值rgb_buf[j*rowstride+i*3+1]和蓝色值rgb_buf[j*rowstride+i*3+2]着色。
测试代码:
#include <gtk/gtk.h>
#define IMAGE_WIDTH 256
#define IMAGE_HEIGHT 256
guchar rgbbuf[IMAGE_WIDTH * IMAGE_HEIGHT * 3];
gboolean on_darea_expose (GtkWidget *widget,GdkEventExpose *event,gpointer user_data);
int main (int argc, char *argv[]){
GtkWidget *window, *darea;
gint x, y;
guchar *pos;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
darea = gtk_drawing_area_new ();
gtk_widget_set_size_request (darea, IMAGE_WIDTH, IMAGE_HEIGHT);
gtk_container_add (GTK_CONTAINER (window), darea);
gtk_signal_connect (GTK_OBJECT (darea), "expose-event",GTK_SIGNAL_FUNC (on_darea_expose), NULL);
gtk_widget_show_all (window);
/* Set up the RGB buffer. */
pos = rgbbuf;
for (y = 0; y < IMAGE_HEIGHT; y++)
{
for (x = 0; x < IMAGE_WIDTH; x++)
{
*pos++ = x - x % 32; /* Red. */
*pos++ = (x / 32) * 4 + y - y % 32; /* Green. */
*pos++ = y - y % 32; /* Blue. */
}
}
gtk_main ();
return 0;
}
gboolean on_darea_expose (GtkWidget *widget,GdkEventExpose *event,gpointer user_data){
gdk_draw_rgb_image (widget->window, widget->style->fg_gc[GTK_STATE_NORMAL],0, 0, IMAGE_WIDTH, IMAGE_HEIGHT,GDK_RGB_DITHER_MAX, rgbbuf, IMAGE_WIDTH * 3);
return TRUE;
}
效果

另外,参数rowstride是IMAGE_WIDTH * 3代表什么意思?
后来的补充:
rowstride 是图像数据区中一行数据占有的内存大小(单位:字节)。和图像宽度 width 有这样的关系:rowstride >= width。由于内存对其的原因,有时 rowstride > width,这样,每行后面都多出一些没有使用到的内存空间。
rgbbuf储存未压缩的8位rgb数据。
如果是3通道RGB图像缓冲区,rgbbuf应该分配的大小是IMAGE_WIDTH * IMAGE_HEIGHT * 3,rowstride值应该是IMAGE_WIDTH * 3
如果是4通道RGBA图像缓冲区,rgbbuf应该分配的大小是IMAGE_WIDTH * IMAGE_HEIGHT * 4,rowstride值应该是IMAGE_WIDTH * 4
看介绍gdk_draw_rgb_image可能不支持RGBA绘图