初学图像处理,用VS2013写bmp文件的读写时,输出的bmp文件无法打开,并且大小只有4096kb。以下是写图片的部分代码:
//自定义的bmp类
typedef struct
{
int mWidth;
int mHeight;
int mCount;
unsigned char* data;
}BMP;
//文件读入
void bmpRead(BMP &bitmap, const char *bmpPath)
{
FILE *file = fopen(bmpPath, "rb");
if (NULL == file)
return;
BITMAPFILEHEADER bmphd;
BITMAPINFOHEADER bmpin;
fread(&bmphd, sizeof(BITMAPFILEHEADER), 1, file);
fread(&bmpin, sizeof(BITMAPINFOHEADER), 1, file);
bitmap.mWidth = bmpin.biWidth;
bitmap.mHeight = bmpin.biHeight;
bitmap.mCount = bmpin.biBitCount;
bitmap.data = new unsigned char[bitmap.mWidth * bitmap.mHeight];
fread(bitmap.data, 1, bitmap.mWidth * bitmap.mHeight, file);
fclose(file);
}
//文件写入
void bmpWrite(BMP &bitmap,const char *bmpPath)
{
FILE *file;
file = fopen(bmpPath, "wb");
if (NULL == file)
return;
int iByteLength = 0;
int colorsize = 0;
if (8 == bitmap.mCount)
{
iByteLength = (bitmap.mWidth + 3 )/ 4 * 4;
colorsize = 1024;
}
else if (24 == bitmap.mCount)
{
iByteLength = (bitmap.mWidth * 3 + 3) / 4 * 4;
}
else
{
iByteLength =( bitmap.mWidth *bitmap.mCount/3 + 3) / 4 * 4;
}
BITMAPFILEHEADER bmphd;
bmphd.bfType = 0x4D42;
bmphd.bfOffBits = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER) + colorsize;
bmphd.bfSize = bmphd.bfOffBits + iByteLength*bitmap.mHeight;
bmphd.bfReserved1 = 0;
bmphd.bfReserved2 = 0;
BITMAPINFOHEADER bmpin;
bmpin.biBitCount = bitmap.mCount;
bmpin.biClrImportant = 0;
bmpin.biClrUsed = 0;
bmpin.biCompression = 0;
bmpin.biHeight = bitmap.mHeight;
bmpin.biPlanes = 1;
bmpin.biSize = sizeof(BITMAPINFOHEADER);
bmpin.biSizeImage =0;
bmpin.biWidth = bitmap.mWidth;
bmpin.biXPelsPerMeter = 300;
bmpin.biYPelsPerMeter = 300;
fwrite(&bmphd, sizeof(BITMAPFILEHEADER), 1, file);
fwrite(&bmpin, sizeof(BITMAPINFOHEADER), 1, file);
if (bitmap.mCount == 8)
{
unsigned char uchPalette[256 * 4];
for (int j = 0; j < 256; j++)
{
uchPalette[j * 4] = (unsigned char)j;
uchPalette[j * 4 + 1] = (unsigned char)j;
uchPalette[j * 4 + 2] = (unsigned char)j;
uchPalette[j * 4 + 3] = 0;
}
fwrite(uchPalette, sizeof(RGBQUAD), 256, file);
}
int i = iByteLength*bitmap.mHeight;
fwrite(bitmap.data, sizeof(unsigned char), i, file);
fclose(file);
}
int main()
{
char* fpath = "C:\\Users\\admin\\Desktop\\picinen\\20210311162754539.bmp";
char* fdstpath = "C:\\Users\\admin\\Desktop\\2.bmp";
BMP bitmap;
bmpRead(bitmap, fpath);
bmpWrite(bitmap, fdstpath);
return 0;
}
目前只考虑24位图。怀疑是fwrite函数有问题,将fwrite(bitmap.data, sizeof(unsigned char), i, file); 这一行代码的i改为具体的数值发现太大的数值(100000是可以的)就无法写入。在网上找不到方法解决,求各位大佬告知!
转换为byte数组保存。
你调试看看读取出来的data的数据长度是否正确呢
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y