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

相关文章

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

Python利用PIL进行图片压缩

《Python利用PIL进行图片压缩》有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所以本文为大家介绍了Python中图片压缩的方法,需要的可以参考下... 有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所有可以对文件中的图

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

Python给Excel写入数据的四种方法小结

《Python给Excel写入数据的四种方法小结》本文主要介绍了Python给Excel写入数据的四种方法小结,包含openpyxl库、xlsxwriter库、pandas库和win32com库,具有... 目录1. 使用 openpyxl 库2. 使用 xlsxwriter 库3. 使用 pandas 库

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前