c++ bmp图像保存之后为全黑
最近自己做一个工具最后涉及到一个存储成bmp位图的形式,由于这部分并不是整个project的重点我就从网上找了例子改了改,但是目前的问题是有很多时候都是存储的bmp全黑,我也并不知道是怎么回事。就像这样:
我的保存bmp的c++头文件:
#ifndef ImgSave_hpp
#define ImgSave_hpp
#include "stdlib.h"
#include "stdio.h"
#include <string>
#include <algorithm>
#define BI_RGB 0L
typedef struct __attribute__ ((__packed__))
{
uint16_t Signature;
uint32_t Size;
uint32_t Reserved;
uint32_t BitsOffset;
} BITMAPFILEHEADER2;
#define BITMAP_FILEHEADER_SIZE 14
typedef struct __attribute__ ((__packed__))
{
uint32_t HeaderSize;
int32_t Width;
int32_t Height;
uint16_t Planes;
uint16_t BitCount;
uint32_t Compression;
uint32_t SizeImage;
int32_t PelsPerMeterX;
int32_t PelsPerMeterY;
uint32_t ClrUsed;
uint32_t ClrImportant;
} BITMAPINFOHEADER2;
bool MSaveImage(std::string szPathName, void* lpBits, int w, int h);
#endif /* ImgSave_hpp */
实现文件:
#include "ImgSave.hpp"
bool MSaveImage(std::string szPathName, void* lpBits, int w, int h)
{
BITMAPINFOHEADER2 BMIH;
BITMAPFILEHEADER2 bmfh;
FILE *pFile = fopen(szPathName.c_str(), "wb");
if(pFile == NULL)
{
return false;
}
BMIH.HeaderSize = sizeof(BITMAPINFOHEADER2);
BMIH.Width = w;
BMIH.Height = h;
BMIH.Planes = 1;
BMIH.BitCount = 24;
BMIH.Compression = BI_RGB;
BMIH.SizeImage = w * h* 3;
int nBitsOffset = sizeof(BITMAPFILEHEADER2) + BMIH.HeaderSize;
long lImageSize = BMIH.SizeImage;
long lFileSize = nBitsOffset + lImageSize;
bmfh.Signature = 'B'+('M'<<8);
bmfh.BitsOffset = nBitsOffset;
bmfh.Size = (int)lFileSize;
bmfh.Reserved =0;
fwrite(&bmfh, 1, sizeof(BITMAPFILEHEADER2), pFile);
fwrite(&BMIH, 1, sizeof(BITMAPINFOHEADER2), pFile);
fwrite(lpBits, 1, lImageSize, pFile);
fclose(pFile);
return true;
}
调用方式:
unsigned char *bitmapImage;
bitmapImage = (unsigned char*)malloc(width*height*3);
for(i=0;i<pixelNum;i++){
bitmapImage[i*3] = (unsigned char)(sourcePixels[i][0]);
bitmapImage[i*3+1]=(unsigned char)(sourcePixels[i][1]);
bitmapImage[i*3+2]=(unsigned char)(sourcePixels[i][2]);
}
string fname = targetPath;
MSaveImage(fname, bitmapImage, width, height);
这个sourcePixels保证是没有问题的,是一张图片的正常信息。
最后保存出来就是全黑,自己暂时没有找到原因,所以请经验人士指点一二 谢谢。
补充:可能跟bmp的文件尾有关 但是具体我还是不是特别清楚
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
感觉是BITMAPINFOHEADER2定义的有问题,我贴一段正确的代码你对比一下:
其中bitmapinfo的定义是:
RGBQUAD bmiColors[1]; 的定义没有在你的代码里发现,你确认下是不是少了这个定义。