Gdiplus byte *数据转换为Bitmap类型图片

2024-06-02 23:32

本文主要是介绍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类型图片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025402

相关文章

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左

SpringBoot中4种数据水平分片策略

《SpringBoot中4种数据水平分片策略》数据水平分片作为一种水平扩展策略,通过将数据分散到多个物理节点上,有效解决了存储容量和性能瓶颈问题,下面小编就来和大家分享4种数据分片策略吧... 目录一、前言二、哈希分片2.1 原理2.2 SpringBoot实现2.3 优缺点分析2.4 适用场景三、范围分片

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

浅析如何保证MySQL与Redis数据一致性

《浅析如何保证MySQL与Redis数据一致性》在互联网应用中,MySQL作为持久化存储引擎,Redis作为高性能缓存层,两者的组合能有效提升系统性能,下面我们来看看如何保证两者的数据一致性吧... 目录一、数据不一致性的根源1.1 典型不一致场景1.2 关键矛盾点二、一致性保障策略2.1 基础策略:更新数

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,