把文件读成二进制流再把图片转换成屏幕上

vv0147   2010-1-29 17:36 楼主
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码转化二进制流后在画到屏幕上,不知可不可行,如果可行的话,请问上边的程序该怎么改?

回复评论 (10)

帮顶下。

MARK.
点赞  2010-1-29 18:28
BMP 图片有它的结构的.
点赞  2010-1-29 19:00
怎么改,不知道。

1,知道bmp文件的格式和你的图片的源文件的格式
2,知道你的转换方法,一进一出
3,知道显示是怎么回事
点赞  2010-1-29 22:00
建议楼主,你自己先试一下,遇到问题可以来这里询问,嘿嘿…楼主贴代码的精神很值得推崇,哈哈…
点赞  2010-1-30 08:49
引用: 引用 2 楼 shenzhentom 的回复:
BMP 图片有它的结构的.

图片有结构我知道,但是我想知道读取图片二进制后在用CreateDIBSection函数通过什么样的转化能画到屏幕上,如果有的话请说具体一点
点赞  2010-2-1 09:43
可以的,,完全没有问题,,
CreateDIBSection可以取得图片的数据的指针,你把接收到的数据memcpy过去就可以了

最关键的问题是,,你要把图片的格式搞清楚,这个不麻烦,理清楚那些概念,你自然就知道怎么搞了
点赞  2010-2-1 21:46

8楼 gga 

学习!
点赞  2010-2-1 22:45
有个工具Image2Lcd可以把图片转换成二进制数据
点赞  2010-2-2 14:53
能够用读取二进制的方式读取文件,但是显示的时候就要考虑BMP的结构了。一把BMP图片一般有32位、24位、16位和8位等,在显示的时候要考虑不同位的图片的调色板
点赞  2010-2-3 13:36
为什么要这么做呢?费解。

系统已经提供了简单的接口去做这些工作,为啥一定要走一条复杂的路。

你转换成二进制以后,最简单的是直接写显存,但是系统不允许应用程序直接去操作显存;对静态图像的处理,都是使用GDI,根本不需要转换成二进制。

你的这种做法,只有在没有OS,或者bootloader里面(OS还启动)才有意义。
点赞  2010-2-3 14:02
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复