Gdiplus byte *数据转换为Bitmap类型图片
最近在mfc上显示缩略图那样显示采集到的图片,这个用CimageList和CListctrl就可以了,网上有很多这里不细说,但是别忘了初始化Gdiplus;
但是我的相机采集到的就是byte类型的数据,一开始显示的时候是先存到一个文件夹存为bmp又读取的。这样的话如果存的很多的话是不是读取慢呢,我说的多是指整个盘里东西很多。然后我就想着直接转换一下多好,但是在网上找了好久,试了不少方法都不行。
又是自己研究,通过研究发现Gdiplus::Bitmap bmp()竟然有12种构造方法,然后我就去找有没有和byte*有关的,找到了个Bitmap(const BITMAPINFO *gdiBitmapInfo,void *gdiBitmapData),以我四级不过得英语看两个参数是“位图信息”和“位图数据”。然后我自己试了下,因为我知道自己要显示的byte*数据宽高800*800和颜色单色。
这是一个位图信息指针,
BITMAPINFO* bitmapinfo=(BITMAPINFO*)new char[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];
这原来是用来把byte*数据存为bmp的函数,我又加了个位图信息指针,如下边红色;
int SaveRawbmp(CString str,unsigned char *Databuff,int Width,int Hight)
{
FILE *fp;
RGBQUAD rgb;
BITMAPFILEHEADER bmfHdr; // 位图文件头结构
BITMAPINFOHEADER bmfinfo;
//MessageBox(NULL,str,_T("标题"), MB_ICONEXCLAMATION);
//char Palette[4*256];
//unsigned char *tempBuff;
WORD PALLength8bit=4*256;
long PixelSize;
PixelSize= Width*Hight;
if((Databuff==NULL)||(Width<8))
return 0;
fp=fopen(str,"wb");
if(fp==NULL)
return 0;
//初始化位图文件头数据
bmfHdr.bfType =0x4d42;
bmfHdr.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+PALLength8bit+PixelSize;//文件总长度
while(bmfHdr.bfSize%4!=0)
{
bmfHdr.bfSize++;
}
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD);
//初始化位图信息头结构
bmfinfo.biSize=40;
bmfinfo.biWidth=Width;
bmfinfo.biHeight=Hight;
bmfinfo.biPlanes=1;
bmfinfo.biBitCount=8;
bmfinfo.biCompression=0;
while(bmfinfo.biWidth%4!=0)
{
bmfinfo.biWidth++;
}
bmfinfo.biSizeImage=(bmfinfo.biWidth*bmfinfo.biBitCount/8)*bmfinfo.biHeight;
bmfinfo.biXPelsPerMeter=0;
bmfinfo.biYPelsPerMeter=0;
bmfinfo.biClrUsed=0;
bmfinfo.biClrImportant=0;
//把生成的位图写成文件
fwrite((LPSTR)&bmfHdr,1,sizeof(BITMAPFILEHEADER),fp);//写文件头
fwrite((LPSTR)&bmfinfo,1,sizeof(BITMAPINFOHEADER),fp);//将位图信息头结构写入文件
if(!bitmapinfo)
{
return 0;
}
bitmapinfo->bmiHeader =bmfinfo;
for(int iIndex=0;iIndex<256;iIndex++)
{
rgb.rgbBlue=iIndex;
rgb.rgbGreen=iIndex;
rgb.rgbRed=iIndex;
rgb.rgbReserved=0;
bitmapinfo->bmiColors[iIndex].rgbBlue=iIndex;
bitmapinfo->bmiColors[iIndex].rgbGreen=iIndex;
bitmapinfo->bmiColors[iIndex].rgbRed=iIndex;
bitmapinfo->bmiColors[iIndex].rgbReserved=0;
fwrite(&rgb,1,sizeof(RGBQUAD),fp);
}
//file.Write((LPSTR)Palette,4*256);//将位图颜色表数据写入文件
fwrite((LPSTR)Databuff,1,Width*Hight,fp);//将位图像素数据写入文件
/*把BMP位图信息头中的数据读取到位图信息结构中去.*/
fclose(fp);
return 1;
}
这就是生成了一个Bitmap类型的变量,bitmapinfo是位图信息,包含宽高颜色等,这个我是根据自己知道的宽高和颜色自己写出来的,part_image就是byte* 的图片数据。要注意的是颜色这,位图信息结构体中的bmiColors[1]是个很奇怪的定义,只有一个元素?显然不是这样的后来找到了如何赋值的方法,虽然不知道为什么,但是这样做的确是对的。
Bitmap img(bitmapinfo,(LPSTR)part_image);
在此要感谢在网上积极回答问题的各位,是你们让我成功的,不是看了各位的讲解,也不可能达到目的。
Gdiplus byte *数据转换为Bitmap类型图片相关推荐
- 初识YUV,实战NV21格式数据转换为Bitmap
初识YUV,实战NV21格式数据转换为Bitmap 一.初识YUV 二.采样方式 2.1.YUV 4:4:4 2.2.YUV 4:2:2 2.2.YUV 4:2:0[重点] 三.存储方式 3.1.pl ...
- numeric转换varchar_数据库中varchar类型数据转换为numeric类型
关于数据库中varchar/nvarchar类型数据的获取注意事项 当在页面后台获取数据库表中某字段的数据时,需注意该数据的类型.防止因实际数据的字符长度因达不到指定数据类型规定的字符长度而导致空格的 ...
- c语言读取png文件大小,求助: C语言- 利用libpng读取png大小,并转换为jpg类型图片...
大家好, 最近研究C语言图像处理这方面遇到一个难题,详情如下: 目标: 将png类型图片的信息读入内存,提取所需要的数据并保存,然后转换为如jpg等其它图片格式. 1. libpng库已经装好,通过m ...
- 如何把double类型的数据转换为int类型的数据?
方法1:强制转型 double a = 12.3; int b = (int)a; System.out.println(b); 结果: 12 方法2:使用封装类Double double a = 1 ...
- OC NDData数据 转换为其他类型的数据
OC数据类型转换 NSData bytes 转其他数据类型 相互转换 可以使用NSScanner 这个类 -(void)getHexStrFromData:(NSData*)//NSDATA 转 HE ...
- numeric转换varchar_SQL怎么样把numeric类型的数据转换为varchar类型的数据
展开全部 可以用cast来转换. 如:列e69da5e6ba9062616964757a686964616f31333433626465名叫grade,表名为A select cast(grade a ...
- c语言uint64_t转String,C语言编程 8字节的数据转换为uint64_t类型数据
有2种方式可以实现: 第一种方式: 数据类型强制转换,需要注意平台是大端还是小端 ,如果平台是大端,那么字节数组存放的字节顺序是高字节在前:如果平台是小端,那么字节数组存放的字节顺序是低字节在前. 此 ...
- java整型转换为数组_基于java中byte数组与int类型的转换(两种方法)
java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...
- java中byte数组与int类型的转换(两种方式)
java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...
最新文章
- java vagrant_vagrant 做一个java web开发环境
- boost::lexicographical_compare相关的测试程序
- 查看Infinicon的HCA卡上的网络流量的方法
- [18/11/22] 将点分十进制的IP地址化成二进制输出
- python能爬取什么_5行代码就能写个爬虫,python真是太方便了!
- 安装WIN10系统时“谁将会使用这台电脑”输入卡死状态的问题
- 简单三步教你制作一个数据可视化大屏
- eclipse安装程序没反应
- Python——飞机大战(day10)
- 六月开发语言排行榜出炉
- 最受欢迎的11个Python编程软件,让你的工作效率直接原地起飞
- 微软Win10这些黑科技小功能你都用过吗
- 当初的愿望实现了么? .
- python中sleep的用法_Python sleep 用法 原
- day19 part1:网络安全态势感知
- 原创 HTML5:JS操作SVG实践体会
- 永磁无刷直流电机与永磁同步电机比较和分析
- 【自然语言处理】【大模型】Chinchilla:训练计算利用率最优的大语言模型
- 学以致用——Excel报表自动化方案探索
- 【安装教程】Windows10/11安装detectron2教程
热门文章
- 有哪些通俗易懂的例子可以解释 IaaS、PaaS、SaaS 的区别?
- 深度剖析:CDN内容分发网络技术原理--转载
- dreamweaver中的JSP的编程环境配置
- Transformer 模型详解
- 深度拆解:直播带货的现状与未来?
- 以太坊再爆高危漏洞!黑客增发ATN 1100万枚token事件始末
- TalkingData大规模机器学习的应用
- Visual Studio 2013开发 mini-filter driver step by step (3) - 查看运行结果
- 白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理
- 实战SSM_O2O商铺_38【商品类别】解除商品与商品类别的关联