热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c++bmp图像保存之后为全黑

最近自己做一个工具最后涉及到一个存储成bmp位图的形式,由于这部分并不是整个project的重点我就从网上找了例子改了改,但是目前的问题是有很多时候都是存储的bmp全黑,我也并不知道是怎么回事。

最近自己做一个工具最后涉及到一个存储成bmp位图的形式,由于这部分并不是整个project的重点我就从网上找了例子改了改,但是目前的问题是有很多时候都是存储的bmp全黑,我也并不知道是怎么回事。就像这样:
图片描述

我的保存bmp的c++头文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#ifndef ImgSave_hpp

#define ImgSave_hpp



#include "stdlib.h"

#include "stdio.h"

#include

#include



#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 */

实现文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#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;

   

}

调用方式:

1
2
3
4
5
6
7
8
9
10
11
12
 unsigned char *bitmapImage;



    bitmapImage = (unsigned char*)malloc(width*height*3);

   

    for(i=0;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的文件尾有关 但是具体我还是不是特别清楚


推荐阅读
author-avatar
晨曦--雨荷
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有