热门标签 | 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的文件尾有关 但是具体我还是不是特别清楚


推荐阅读
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 本文探讨了异步编程的发展历程,从最初的AJAX异步回调到现代的Promise、Generator+Co以及Async/Await等技术。文章详细分析了Promise的工作原理及其源码实现,帮助开发者更好地理解和使用这一重要工具。 ... [详细]
  • Vue CLI 基础入门指南
    本文详细介绍了 Vue CLI 的基础使用方法,包括环境搭建、项目创建、常见配置及路由管理等内容,适合初学者快速掌握 Vue 开发环境。 ... [详细]
  • Hanks博士是一位著名的生物技术专家,他的儿子Hankson对数学有着浓厚的兴趣。最近,Hankson遇到了一个有趣的数学问题,涉及求解特定条件下的正整数x,而不使用传统的辗转相除法。 ... [详细]
  • 本文探讨了Python类型注解使用率低下的原因,主要归结于历史背景和投资回报率(ROI)的考量。文章不仅分析了类型注解的实际效用,还回顾了Python类型注解的发展历程。 ... [详细]
  • 本文探讨了如何将Python对象转换为字节流,以实现文件保存、数据库存储或网络传输的需求。主要介绍了利用pickle模块进行序列化的具体方法。 ... [详细]
  • 本文将详细探讨 Python 编程语言中 sys.argv 的使用方法及其重要性。通过实际案例,我们将了解如何在命令行环境中传递参数给 Python 脚本,并分析这些参数是如何被处理和使用的。 ... [详细]
  • 深入解析C语言中的关键字及其分类
    本文将全面介绍C语言中的关键字,并按照功能将其分为数据类型关键字、控制结构关键字、存储类别关键字和其他关键字四大类,旨在帮助读者更好地理解和运用这些基本元素。C语言中共有32个关键字。 ... [详细]
  • Zabbix自定义监控与邮件告警配置实践
    本文详细介绍了如何在Zabbix中添加自定义监控项目,配置邮件告警功能,并解决测试告警时遇到的邮件不发送问题。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 在Android中实现黑客帝国风格的数字雨效果
    本文将详细介绍如何在Android平台上利用自定义View实现类似《黑客帝国》中的数字雨效果。通过实例代码,我们将探讨如何设置文字颜色、大小,以及如何控制数字下落的速度和间隔。 ... [详细]
  • 想把一组chara[4096]的数组拷贝到shortb[6][256]中,尝试过用循环移位的方式,还用中间变量shortc[2048]的方式。得出的结论:1.移位方式效率最低2. ... [详细]
  • td{border:1pxsolid#808080;}参考:和FMX相关的类(表)TFmxObjectIFreeNotification ... [详细]
  • 处理Android EditText中数字输入与parseInt方法
    本文探讨了如何在Android应用中从EditText组件安全地获取并解析用户输入的数字,特别是用于设置端口号的情况。通过示例代码和异常处理策略,展示了有效的方法来避免因非法输入导致的应用崩溃。 ... [详细]
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社区 版权所有