GTK修改pixmap像素,提取pixmap像素RGB值

⌚Time: 2022-08-01 16:44:01

👨‍💻Author: Jack Ge

gdk_pixbuf_get_pixels ()


guchar *            gdk_pixbuf_get_pixels               (const GdkPixbuf *pixbuf);

Queries a pointer to the pixel data of a pixbuf.

返回指向pixbuf像素数据的指针。

包括RGB三个通道,每一个通道8位,和一个alpha通道

通过函数gdk_pixbuf_get_has_alpha来得知是否有alpha通道(RGB或者RGBA通道)

gdk_pixbuf_get_n_channels获取通道数(有alpha通道应该是4,而没有是3)

测试:


#include <gtk/gtk.h>



#define WIDTH 300

#define HEIGHT 300



GtkWidget *window;

GdkPixbuf *pixbuf_0;

GtkWidget *image;

guchar *rgbbuf;

long pos = 0;

int n_channels;



int main() {



    gtk_init(NULL, NULL);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);

    gtk_window_set_default_size(GTK_WINDOW(window), WIDTH, HEIGHT);

    gtk_window_set_title(GTK_WINDOW(window), "Demo");

    

    pixbuf_0 = gdk_pixbuf_new_from_file("bg2.jpeg",NULL);//从文件加载pixbuf

    rgbbuf = gdk_pixbuf_get_pixels (pixbuf_0);//从pixbuf获取像素数据

    n_channels = gdk_pixbuf_get_n_channels (pixbuf_0);//获取通道数

    //开始修改像素数据

    for (int y = 0; y < gdk_pixbuf_get_height (pixbuf_0); y++)//行

    {

        for (int x = 0; x < gdk_pixbuf_get_width (pixbuf_0); x++)//列

        {

            if(x<gdk_pixbuf_get_width (pixbuf_0)/2&&y<gdk_pixbuf_get_height(pixbuf_0)/2)//仅对左上1/4进行修改

            {

                //豆沙色rgb

                rgbbuf[pos*n_channels] = 199;         /* Red. */

                rgbbuf[pos*n_channels+1] = 237;          /* Green. */

                rgbbuf[pos*n_channels+2] = 204;         /* Blue. */

                if(gdk_pixbuf_get_has_alpha(pixbuf_0)){//是否有alpha通道

                    rgbbuf[pos*n_channels+3] = 111;         /* alpha. */

                }

            }

            pos++;//rgbbuf 索引数加1

        }

    }



    image = gtk_image_new_from_pixbuf(pixbuf_0);//将pixbuf数据生成image图像

    //显示图像

    gtk_container_add(GTK_CONTAINER(window),image);

    gtk_widget_show_all(window);

    g_signal_connect(G_OBJECT(window),"destroy",G_CALLBACK(gtk_main_quit),NULL);

    gtk_main();

}




将右上角四分之一的全部像素用豆沙色填充