免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4749 | 回复: 2
打印 上一主题 下一主题

gtk cairo 画图颜色的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-27 21:15 |只看该作者 |倒序浏览

一个数据文件中, 每个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: in\n", __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: out\n", __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;
}

因为对图片的这些数据格式不太了解.求各位指点!谢谢

论坛徽章:
0
2 [报告]
发表于 2010-04-29 22:58 |只看该作者
学习了哈。。

论坛徽章:
0
3 [报告]
发表于 2010-06-22 19:31 |只看该作者
你用的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: in\n", __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: out\n", __func__);
        return FALSE;
}


推荐一个gtk编程网站:
http://youcaidi.5d6d.com/bbs.php
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP