嵌入设备上显示界面的截取问题,请教图形处理高手

jsjjms 2006-08-18 11:44:55
本人想从手机界面上截取图片下来。
现知道Buffer->LCD的用到的 图形数据,想将这块数据变成BMP(256色)格式显示出来。

我的程序如下。
说明: 因为不想配置文件信息头和图象描述信息块,
我就直接画了一副256色的BMP图,从里面截取了

文件信息头和图象描述信息块,总共长 46 + 1024

#define FILE_HEAD 46
#define COLOR_TABLE 1024
#define LCD_WIDTH 128
#define LCD_HEIGHT 160

//这个数组用来保存文件信息头和图象描述信息块
U8 ImageHead[FILE_HEAD + COLOR_TABLE];

void SaveCurrentScreen(unsigned char *dst)
{
//说明: gMainLCDBuff就是LCD上图形的buffer.
FILE *fp;
fp = fopen("currentScreen.bmp", "wb");
fwrite(dst, FILE_HEAD + COLOR_TABLE, 1, fp);
fwrite(gMainLCDBuff, LCD_HEIGHT*LCD_WIDTH *sizeof(int), 1, fp);
fclose(fp);
}


void MixSaveImage(void)
{
//test.bmp是一副已经画好的256色的Bmp图片,上面这段就是
//直接从里面读出文件信息头和图象描述信息块
FILE *fp;
fp = fopen("test.bmp", "rb");
fread(ImageHead, FILE_HEAD+COLOR_TABLE, 1, fp);
fclose(fp);

SaveCurrentScreen(ImageHead);
}

经过上面两个函数的处理,没有办法保存图片,保存下来的尽是一些乱七八糟的东西,
请教高手帮忙,谢谢。
...全文
361 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsjjms 2006-08-22
  • 打赏
  • 举报
回复
非常感谢各位帮忙!
SnowOnSahara 2006-08-21
  • 打赏
  • 举报
回复
仔细看看位图格式,有没有用到CLUT,如果用到,可能每个BYTE都是索引信息,需要从CLUT查找出对应的颜色。
qdhuxp 2006-08-21
  • 打赏
  • 举报
回复
我贴一下吧,因为程序很长,我把重点代码说一下
声明;我所采用的是640*480的24位RGB格式图像,不需要调色板
image_width=640;image_height=480;
/************************************************************
*BMP24 file header
*qdhuxp@163.com 2006.6.19
************************************************************/
unsigned char BMP24FIlEHEADER_640480[54]={
0x42,0x4d,0x36,0x10,0x0e,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x28,0x00,
0x00,0x00,0x80,0x02,0x00,0x00,0xe0,0x01,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0x0e,0x00,0x00,0xc4,0x0e,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00};
/**********************************************************
* write 24bit BMP file
*qdhuxp@163.com 2006.6.20
*********************************************************/
void write_BMP24_file (char * filename)
{
FILE * outfile,*udiskfile; /* target file */
char udiskfile_name[30];
char *udisk_path="/tmp/udisk/";
int udisk_status;
int i=0, j=0,size=0;

if(image_height==240){
memcpy(BMP24file,BMP24FIlEHEADER_320240, 54);
}else{
memcpy(BMP24file,BMP24FIlEHEADER_640480, 54);
}

//reverse the string 因为图像是RGB顺序的,并且是颠倒的,将图像数据逆转一下就好了
size=image_height*image_width*3;
i=0;
j=size-1;
while(i<size+1 && j>=0)
{
BMP24file[i+54]=image_buffer[j];
i++;
j--;
}
if ((udiskfile = fopen(udiskfile_name, "wb")) == NULL)
{
fprintf(stderr, "can't open %s\n", udiskfile_name);
}
else
{
fwrite(BMP24file,sizeof(unsigned char),size+54,udiskfile);
fclose(udiskfile);
}
}


以上是针对24位图像的,文件头共54个字节,你如果是256色图像也就是8位的,该一下文件头就行了吧
jsjjms 2006-08-21
  • 打赏
  • 举报
回复
to: qdhuxp(阿牛) ( ) 信誉:100
能不能将你的做实验的代码发我看看,谢谢。
jsjjms@126.com
jsjjms 2006-08-21
  • 打赏
  • 举报
回复
仔细看看位图格式,有没有用到CLUT,如果用到,可能每个BYTE都是索引信息,需要从CLUT查找出对应的颜色。

==================================================================
我看了一下BMP的标准格式, 好象没有提到这个,我用的也是最简单的模式来存的。
谢谢。
jsjjms 2006-08-21
  • 打赏
  • 举报
回复

文件信息头和图象描述信息块,总共长 46 + 1024
========================
是标准的BMP文件吗? 标准BMP不是这个长度噢~

fwrite(gMainLCDBuff, LCD_HEIGHT*LCD_WIDTH *sizeof(int), 1, fp);
===============================
你提到是256色BMP,那数据区是1byte/pixel,即每个象素占1字节,而不是4字节。
=========================================================================
我找了一下文档, 00~0D 是文件头信息块,
0E~31是图象描述信息块,占49个字符,原先搞错了。
不过改了还是显示不正确。

LCD_HEIGHT*LCD_WIDTH *sizeof(int)这个是我们设备上的截取下来的数据大小。
我们屏幕一个pixel确实是用unsigned int来存的。如果用一个字节来存,估计只能是
黑白屏了吧?
dongpy 2006-08-20
  • 打赏
  • 举报
回复
文件信息头和图象描述信息块,总共长 46 + 1024
========================
是标准的BMP文件吗? 标准BMP不是这个长度噢~

fwrite(gMainLCDBuff, LCD_HEIGHT*LCD_WIDTH *sizeof(int), 1, fp);
===============================
你提到是256色BMP,那数据区是1byte/pixel,即每个象素占1字节,而不是4字节。
qdhuxp 2006-08-19
  • 打赏
  • 举报
回复
按理说应该是对的,我将24位BMP图像的文件头与RGB数据拼接后写入文件显示是正确的,我觉得出现错误的原因可能是在读文件然后再写文件这个过程中出现的,有必要验证一下
要不就这样做:
void SaveCurrentScreen(unsigned char *dst, long RGB_Length)
{
//说明: gMainLCDBuff就是LCD上图形的buffer.
FILE *fp;
unsigned char *p = NULL;

p = (unsigned char *)malloc(sizeof(unsigned char) * (FILE_HEAD + COLOR_TABLE+RGB_Length));
memcpy(p, dst, FILE_HEAD + COLOR_TABLE);
memcpy(&p[FILE_HEAD + COLOR_TABLE], gMainLCDBuff, RGB_Length);
fp = fopen("currentScreen.bmp", "wb");
fwrite(p, sizeof(unsigned char), FILE_HEAD + COLOR_TABLE+RGB_Length, fp);
fclose(fp);
free(p);
p = NULL;
}
虽然memcpy耗点时间,但这样应该是对的,LZ验证一下试试
jsjjms 2006-08-18
  • 打赏
  • 举报
回复
图片的保存读取方式是
从下到上,从左到右
============================
根据标准BMP格式
开头是文件标识,为Ascii码 “BM”,
读图象文件的时候确实是这样的呀,在文件的开头就是BM,
你所说的从下到上是什么意思呢?谢谢。
Dong 2006-08-18
  • 打赏
  • 举报
回复
图片的保存读取方式是
从下到上,从左到右
其它的帮不了你了,
jsjjms 2006-08-18
  • 打赏
  • 举报
回复
先执行函数 MixSaveImage,保存文件信息头和图象描述信息块, 然后再执行SaveCurrentScreen,将文件信息头和图象描述信息块以及真正的图形数据写
入文件。
OpenHero 2006-08-18
  • 打赏
  • 举报
回复
网上好多图像处理都是处理bmp格式的,找个代码就ok了~~
jsjjms 2006-08-18
  • 打赏
  • 举报
回复
jixingzhong,你不是做图象这块的吗?
有没有什么源代码可以参考一下?
谢谢了。

对于BMP图象格式我也只看了一些原理性的东西,
以前也从来没有做过.
jixingzhong 2006-08-18
  • 打赏
  • 举报
回复
就是 在文件中象素点的顺序和 机器绘图的时候的点的顺序要一致 ...
jixingzhong 2006-08-18
  • 打赏
  • 举报
回复
发烧了 ...
看到程序头晕 ...

UPcc 提到的是一个问题,
如果顺序不对,
自然是结果图形混乱的 ...
jsjjms 2006-08-18
  • 打赏
  • 举报
回复
自己Up一下,有没有哪位有空帮指点一下,谢谢!

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧