LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1391|回复: 6

arm开发板上,Directfb+GTK的GUI不能显示8位的录像,我想请教一下realtang版主。

[复制链接]
发表于 2008-6-30 15:16:30 | 显示全部楼层 |阅读模式
[具体情况]

framebuffer经改动已经是8位的
GUI是DirectFB+GTK
应用程序是GTK的应用程序,可以在PC上播放录像(8位的灰度图像),已经完成,

[问题]

本来以为8位的灰度图像在8位的framebuffer上会显示得很正常,
但是把程序移植到开发板上的时候有问题了,看到的图像是云彩图像,一片一片的。

[提问]
两个问题
1,请问这是怎么回事呢?
下面的情况是我的一个推测。
我是作了一个实验,如果把24位的黑白图像变成8位的黑白图像会出现这样的问题,(从高位向低位变)正常的图像会变成云彩图像,在开发板上,Directfb+GTK的GUI先把8位的录像变成24位了,我用下面的函数画出图像。

        gdk_draw_gray_image(widget->window,
                        widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
                        0,0,720,480,GDK_RGB_DITHER_NORMAL,buf,720);
       //buf是二进制的数据。

但是到显存里图像直接变成8位的了,出现数据丢失。

应该如何解决?
这个问题我到DirectFB的邮件列表里去找了,
在这里找到了一种解决的方法 http://www.mail-archive.com/dire ... b.org/msg00177.html
大致就是说用alpha通道解决这个问题。我一直知道的是alpha通道是用来作透明用的。


我不知道这种方法对不对,或者还是有什么好的方法值得考虑的,比如用pixbuf等等,所以现在十分困惑,请社区里的版主和大侠们指点一下。
 楼主| 发表于 2008-7-1 11:33:32 | 显示全部楼层
[具体情况]

framebuffer经过改动已经是8位的
GUI是DirectFB+GTK
应用程序是GTK的应用程序,可以在PC上播放录像(8位的灰度图像),已经完成,

[问题]

本来以为8位的灰度图像在8位的framebuffer上会显示得很正常,
但是把程序移植到开发板上的时候有问题了,看到的图像是云彩图像,一片一片的。

[提问]
两个问题
1,请问这是怎么回事呢?
下面的情况是我的一个推测。
我是作了一个实验,如果把24位的黑白图像变成8位的黑白图像会出现这样的问题,(从高位向低位变)正常的图像会变成云彩图像,在开发板上,Directfb+GTK的GUI先把8位的录像变成24位了,我用下面的函数画出图像。

gdk_draw_gray_image(widget->window,
widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
0,0,720,480,GDK_RGB_DITHER_NORMAL,buf,720);
//buf是二进制的数据。

但是到显存里图像直接变成8位的了,出现数据丢失。

应该如何解决?
以下是我想的一些解决方法
1,pixbuf,这种类型是专门处理灰度图像的。

2,把RGB都设置成相等的值,再刷到内存里。

3,这个问题我到DirectFB的邮件列表里去找了,
在这里找到了一种解决的方法
http://www.mail-archive.com/directfb-us ... 00177.html
大致就是说用alpha通道解决这个问题。我一直知道的是alpha通道是用来作透明用的。

注:我直接操作显存,发现在开发板上播放录像是成功的。
问题一定在GUI这里,或者是Directfb+GTK的bug,或者程序有要修改的地方。

1,下面的程序是第一种解决方法,编译通过,运行时出问题,报错gdk_pixbuf_loader_write这里有问题难道是我用错了么?

/*这个程序只要求把视频的第一帧图像取出,并画在Drawingarea上,使用pixbuf*/

#include <gtk/gtk.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>

#define BUF_SIZE 720*480

static GtkWidget *window;
static GtkWidget *hbox;
static GtkWidget *drawingarea;

static GdkPixbufLoader *pixbuf_loader;
static GdkPixbuf *pixbuf;

FILE *fp;
char buf[BUF_SIZE];

gboolean draw_some( GtkWidget *widget, GdkEventExpose *event,
gpointer data )
{
/*我用下面的函数在PC上是可以画图的
gdk_draw_gray_image(widget->window,
widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
0,0,720,480,GDK_RGB_DITHER_NORMAL,buf,720);
*/

gdk_draw_pixbuf(widget->window,
widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
pixbuf,0,0,0,0,720,480,GDK_RGB_DITHER_NORMAL,0,0);

return TRUE;
}

int main(int argc,gchar *argv[])
{
gtk_init(&argc,&argv);

window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"一个显示视频的应用程序");
gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
gtk_window_set_default_size(GTK_WINDOW(window),720,480);
g_signal_connect(G_OBJECT(window),"delete_event",
G_CALLBACK(gtk_main_quit),NULL);
gtk_widget_show(window);

hbox=gtk_hbox_new(FALSE,0);
gtk_container_add(GTK_CONTAINER(window),hbox);
gtk_widget_show(hbox);

drawingarea=gtk_drawing_area_new();
gtk_box_pack_start(GTK_BOX(hbox),drawingarea,TRUE,TRUE,0);
gtk_widget_show(drawingarea);

if(! (fp=fopen("my.seq","r")))
{
printf("Error in open file my.seq\n");
exit(1);
}

memset(buf,0,BUF_SIZE*sizeof(char));

if(fread(buf,sizeof(char),BUF_SIZE,fp)<0)
{
printf("Error in read file \n");
exit(1);
}

if(!(gdk_pixbuf_loader_write( pixbuf_loader, buf, BUF_SIZE, 0 )))
{
printf("loader write error!\n");
exit(1);
}
gdk_pixbuf_loader_close (pixbuf_loader, 0 );
pixbuf = gdk_pixbuf_loader_get_pixbuf( pixbuf_loader );

g_signal_connect( G_OBJECT( drawingarea ), "expose_event",
G_CALLBACK( draw_some ), NULL );

if(fclose(fp))
{
printf("Error in close file!\n");
exit(1);
}

gtk_main();
return 0;
}
回复 支持 反对

使用道具 举报

发表于 2008-7-1 12:33:18 | 显示全部楼层
楼主的问题看了半天, 还是有几个地方不太明确:

* 程序在 PC 上运行时, 录像本身是什么色彩格式的? PC 上是跑 GTK/X 还是 GTK/DFB? 其色深?
* 开发板上显示的 "云彩" 与真实的图像相比有什么相似之处么? 比如形状, 彩色.
* 在开发板上运行时把调色板打印出来, 看看是否正确. 如果不正确, 那么手工设置一下调色板后效果又如何呢?

我对 gtk 不熟, DFB 倒是做过一点点, 因此无法直接判断楼主的代码是否正确, 仅能提供如上一些提示
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-1 14:14:26 | 显示全部楼层
录像是8位灰度
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-1 14:47:27 | 显示全部楼层
在directfb的官方网站里找到很重要的一条,如下

Graphics Core
....................
Added DFBColorKey which is binary compatible with DFBColor for RGB, but has an 8 bit color index instead of the alpha value.

又在API中找到这种图像格式,嘎嘎
DSPF_A8 8 bit alpha (1 byte, alpha 8@0), e.g. anti-aliased glyphs

都和邮件列表里面的提示是相同的。
回复 支持 反对

使用道具 举报

发表于 2008-7-1 17:06:25 | 显示全部楼层
我个人倒是建议使用 LUT8 模式, 应该也是 8bpp 情况下默认的, 不过需要设置一下调色板就是了, 如何设置取决于录像的数据格式.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-10 11:40:54 | 显示全部楼层

呵呵问题解决了

呵呵问题解决了,解贴。
解决方法如下:
我以前是直接画像素的,现在用Bitmap来实现即可。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表