shn_baby
2021-05-11 16:26
采纳率: 100%
浏览 67

用C语言写BMP写入后,文件无法打开并且文件大小只有4096字节

初学图像处理,用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是可以的)就无法写入。在网上找不到方法解决,求各位大佬告知!

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • 已采纳

    转换为byte数组保存。

    已采纳该答案
    评论
    解决 1 无用
    打赏 举报
  • 快乐鹦鹉 2021-05-11 16:40

    你调试看看读取出来的data的数据长度是否正确呢

    评论
    解决 无用
    打赏 举报
  • 有问必答小助手 2021-05-11 19:30

    您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

    如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

    ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

    评论
    解决 无用
    打赏 举报
  • 有问必答小助手 2021-05-13 15:12

    非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

    速戳参与调研>>>https://t.csdnimg.cn/Kf0y

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题