GTK进行rgb绘图

⌚Time: 2022-07-29 15:08:37

👨‍💻Author: Jack Ge

使用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绘图