欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

C++读图片——Mac下对于bmp文件读写读取过大的解决方案

发布时间:2024/4/11 51 豆豆
生活随笔 收集整理的这篇文章主要介绍了 C++读图片——Mac下对于bmp文件读写读取过大的解决方案 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

Mac下对bmp文件处理时size过大的解决方案

当在读写bmp信息头的时候,首先对根据C和C++的对齐预编译指令进行对齐之后,当进行读文件之后会出现biWidth和biHeight过大的情况。本篇文章对这个情况提出解决方案。

struct BITMAPINFOHEADER{unsigned long biSize; //本结构所占用字节数 40字节long biWidth; //位图的宽度,以像素为单位long biHeight; //位图的高度,以像素为单位unsigned short biPlanes; //目标设备的级别,必须为1unsigned short biBitCount; //每个像素所需的位数,必须是1(双色)、4(16色)、8(256色)或24(真彩色)之一unsigned long biCompression; //位图压缩类型,必须是 0(BI_RGB不压缩)、unsigned long biSizeImage; //位图的大小,以字节为单位long biXPelsPerMeter; //位图水平分辨率,每米像素数long biYPelsPerMeter; //位图垂直分辨率,每米像素数unsigned long biClrUsed; //位图实际使用的颜色表中的颜色数unsigned long biClrImportant; //位图显示过程中重要的颜色数};

问题描述

当读取文件之后进行malloc或者new处理时,会出现malloc分配空间出现错误的情况,此时查看信息头之后发现biWidth和biHeight过大的情况(如下图),此时进行图片写入的时候会出现错误。

此时用sizeof对信息头进行输出之后发现原本对齐之后应该是40的变成了80。
此时便出现了读文件错误。

解决方法

此时就要考虑到我们在读文件时,运用对齐之后计算机应该读取40个字节,但是此时读取了80个字节,所以出现了读取错误。此时就要考虑到电脑编译器是不是32位的,后面发现Mac下的编译器确实是64位的,而64位下的long是8个字节,所以在对齐之后信息头所占的字节数时80,因此解决方法也很简单,只需要将long改为int即可解决。

struct BITMAPINFOHEADER {unsigned int biSize; //本结构所占用字节数 40字节int biWidth; //位图的宽度,以像素为单位int biHeight; //位图的高度,以像素为单位unsigned short biPlanes; //目标设备的级别,必须为1unsigned short biBitCount; //每个像素所需的位数,必须是1(双色)、4(16色)、8(256色)或24(真彩色)之一unsigned int biCompression; //位图压缩类型,必须是 0(BI_RGB不压缩)、unsigned int biSizeImage; //位图的大小,以字节为单位int biXPelsPerMeter; //位图水平分辨率,每米像素数int biYPelsPerMeter; //位图垂直分辨率,每米像素数unsigned int biClrUsed; //位图实际使用的颜色表中的颜色数unsigned int biClrImportant; //位图显示过程中重要的颜色数 };


此时问题就得到解决啦。

总结

以上是生活随笔为你收集整理的C++读图片——Mac下对于bmp文件读写读取过大的解决方案的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。