gdk_pixbuf_get_pixels ()
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();
}
将右上角四分之一的全部像素用豆沙色填充
