void read_from_binary_file(char * instream, int & count)
{
int size=0;
long curpos;
FILE *fp=NULL;
if((fp=fopen("Storage Card\\in1.bmp","rb"))!=NULL)
{
printf("Open files OK\n");
};
if(fp == NULL)
{
exit(0);
}
curpos = ftell(fp);
fseek(fp, 0L, SEEK_END);
count = ftell(fp);
fseek(fp, curpos, SEEK_SET);
char* filetext=instream;
if(!feof(fp))
{
fread(filetext,count,1,fp);
}
if(ferror(fp))
{
exit(0);
}
fclose(fp);
}
char* in1 = new char[1024*1024];
int count=0;
read_from_binary_file(in1, count);
HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
BITMAPINFOHEADER head;
memset(&head,0,sizeof(head));
memcpy( &head,in1/*out*/,sizeof(BITMAPINFOHEADER));
int colorTablesize = 0;
if(head.biBitCount == 8)
colorTablesize = 1024;
//定义变量,计算图像每行所占的字节数(必须是4的倍数)
int lineByte = (head.biWidth * head.biBitCount / 8 +3) / 4 * 4;
BITMAPFILEHEADER fileHead;
fileHead.bfType = 0x4D42; //bmp类型
//bfSize是图像文件4个组成部分之和
fileHead.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+colorTablesize+lineByte*head.biHeight;
fileHead.bfReserved1 = 0;
fileHead.bfReserved2 = 0;
fileHead.bfOffBits = 54 + colorTablesize;//bf0ffBits是图像文件前3部分所需的空间之和
BITMAPINFO bitmapInfo;
memset((void *)&bitmapInfo,0,sizeof(BITMAPINFO) );
bitmapInfo.bmiHeader=head;
bitmapInfo.bmiColors[0].rgbRed=255;
bitmapInfo.bmiColors[0].rgbGreen=255;
bitmapInfo.bmiColors[0].rgbBlue=255;
HDC hMemDC=CreateCompatibleDC(hDC);
BYTE *m_lpBitBmp=new BYTE[4*head.biWidth*head.biWidth];
HBITMAP hDibBitmap=CreateDIBSection(hMemDC,&bitmapInfo,DIB_RGB_COLORS,(void **)&m_lpBitBmp,NULL,0);
if(hDibBitmap != 0)
{
SelectObject(hMemDC,hDibBitmap);
BitBlt(hDC,0,0,head.biWidth,head.biWidth,hMemDC,0,0,SRCCOPY);
}
DeleteObject(hDibBitmap);
DeleteDC(hDC);
DeleteDC(hMemDC);
/*delete []out;*/
delete []in1;
请问这样把一个图片转化成二进制后在屏幕上话画图,不是按图片结构的读的文件,我不知道能不能在屏幕上画出,实际上是我的程序是把图片转化成二进制流在转化成base64码,在把base64码转化二进制流后在画到屏幕上,不知可不可行,如果可行的话,请问上边的程序该怎么改?
怎么改,不知道。
1,知道bmp文件的格式和你的图片的源文件的格式
2,知道你的转换方法,一进一出
3,知道显示是怎么回事
建议楼主,你自己先试一下,遇到问题可以来这里询问,嘿嘿…楼主贴代码的精神很值得推崇,哈哈…
引用: 引用 2 楼 shenzhentom 的回复:
BMP 图片有它的结构的.
图片有结构我知道,但是我想知道读取图片二进制后在用CreateDIBSection函数通过什么样的转化能画到屏幕上,如果有的话请说具体一点
可以的,,完全没有问题,,
CreateDIBSection可以取得图片的数据的指针,你把接收到的数据memcpy过去就可以了
最关键的问题是,,你要把图片的格式搞清楚,这个不麻烦,理清楚那些概念,你自然就知道怎么搞了
有个工具Image2Lcd可以把图片转换成二进制数据
能够用读取二进制的方式读取文件,但是显示的时候就要考虑BMP的结构了。一把BMP图片一般有32位、24位、16位和8位等,在显示的时候要考虑不同位的图片的调色板
为什么要这么做呢?费解。
系统已经提供了简单的接口去做这些工作,为啥一定要走一条复杂的路。
你转换成二进制以后,最简单的是直接写显存,但是系统不允许应用程序直接去操作显存;对静态图像的处理,都是使用GDI,根本不需要转换成二进制。
你的这种做法,只有在没有OS,或者bootloader里面(OS还启动)才有意义。