gtk cairo 画图颜色的疑问
一个数据文件中, 每个byte为unsigned char 类型, 用其表示一个像素点...
单个unsigned char 的值, 如果为0xff的话,则此像素点为白色, 如果为0x00的话,则为黑色.
但是我碰到一个问题,画图时颜色恰恰与上面所说的相反..为了测试, 做了个测试的小程序.如下:
/****************************************/
#include <stdio.h>
#include <gtk/gtk.h>
#include <string.h>
static gboolean
on_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
fprintf(stdout, "> %s: inn", __func__);
cairo_t *cr;
cairo_surface_t *surface;
unsigned char tmp[480 * 620];
memset(tmp, 0xff, 480 * 620); /* 0xff 时, 窗口为黑色, 0x00时, 窗口为白色..这样跟我想的刚好相反啊 */
/* 是不是下面这个函数的问题? */
surface = cairo_image_surface_create_for_data(tmp,
CAIRO_FORMAT_A8, 480, 620, 480);
cr = gdk_cairo_create(widget->window);
cairo_set_source_surface(cr, surface, 0, 20);
cairo_paint(cr);
cairo_destroy(cr);
fprintf(stdout, "< %s: outn", __func__);
return FALSE;
}
int
main(int argc, char *argv[])
{
GtkWidget *window;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "PDF READER");
gtk_window_set_default_size(GTK_WINDOW(window),
480, 640);
gtk_container_set_border_width(GTK_CONTAINER(window), 0);
gtk_widget_set_app_paintable(window, TRUE);
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
g_signal_connect(G_OBJECT(window), "destroy",
G_CALLBACK(gtk_main_quit), NULL);
g_signal_connect(G_OBJECT(window), "expose-event",
G_CALLBACK(on_expose_event), NULL);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
因为对图片的这些数据格式不太了解.求各位指点!谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你用的format是“CAIRO_FORMAT_A8”,看一下说明:each pixel is a 8-bit quantity holding an alpha value. 即每一个点是一个8位的数表示alpha值,alpha是表示透明程度的,所以你的程序,0xff表示不透明黑色,0x00表示全透明为白色(其实看到的应该不是白色,而是底色)。
修改一下你的on_expose_event函数,
static gboolean
on_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
cairo_format_t format;
int stride;
fprintf(stdout, "> %s: inn", __func__);
cairo_t *cr;
cairo_surface_t *surface;
unsigned char *tmp;
//memset(tmp, 0x0, 480 * 620); /* 0xff 时, 窗口为黑色, 0x00时, 窗口为白色..这样跟我想的刚好相反啊 */
/* 是不是下面这个函数的问题? */
stride = cairo_format_stride_for_width (CAIRO_FORMAT_RGB24, 480);
tmp= malloc(stride*620);
memset(tmp, 0x0, stride * 620); //你能看到0x00时为黑色,0xff时为白色
surface = cairo_image_surface_create_for_data(tmp,
CAIRO_FORMAT_RGB24, 480, 620, stride);
cr = gdk_cairo_create(widget->window);
cairo_set_source_surface(cr, surface, 0, 20);
cairo_paint(cr);
cairo_destroy(cr);
fprintf(stdout, "< %s: outn", __func__);
return FALSE;
}
推荐一个gtk编程网站:
http://youcaidi.5d6d.com/bbs.php
学习了哈。。