8052|10

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

把文件读成二进制流再把图片转换成屏幕上 [复制链接]

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

最新回复

为什么要这么做呢?费解。 系统已经提供了简单的接口去做这些工作,为啥一定要走一条复杂的路。 你转换成二进制以后,最简单的是直接写显存,但是系统不允许应用程序直接去操作显存;对静态图像的处理,都是使用GDI,根本不需要转换成二进制。 你的这种做法,只有在没有OS,或者bootloader里面(OS还启动)才有意义。  详情 回复 发表于 2010-2-3 14:02
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
帮顶下。

MARK.
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
BMP 图片有它的结构的.
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

4
 
怎么改,不知道。

1,知道bmp文件的格式和你的图片的源文件的格式
2,知道你的转换方法,一进一出
3,知道显示是怎么回事
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

5
 
建议楼主,你自己先试一下,遇到问题可以来这里询问,嘿嘿…楼主贴代码的精神很值得推崇,哈哈…
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 2 楼 shenzhentom 的回复:
BMP 图片有它的结构的.

图片有结构我知道,但是我想知道读取图片二进制后在用CreateDIBSection函数通过什么样的转化能画到屏幕上,如果有的话请说具体一点
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
可以的,,完全没有问题,,
CreateDIBSection可以取得图片的数据的指针,你把接收到的数据memcpy过去就可以了

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

回复

71

帖子

0

TA的资源

一粒金砂(初级)

8
 
学习!
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

9
 
有个工具Image2Lcd可以把图片转换成二进制数据
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

10
 
能够用读取二进制的方式读取文件,但是显示的时候就要考虑BMP的结构了。一把BMP图片一般有32位、24位、16位和8位等,在显示的时候要考虑不同位的图片的调色板
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

11
 
为什么要这么做呢?费解。

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

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

你的这种做法,只有在没有OS,或者bootloader里面(OS还启动)才有意义。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表