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

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化: