gtk cairo 画图颜色的疑问

发布于 2022-08-28 04:56:26 字数 3353 浏览 12 评论 2


一个数据文件中, 每个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

给妤﹃绝世温柔 2022-09-04 16:53:52

你用的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

美人骨 2022-09-04 06:51:37

学习了哈。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文