在 C/C++ 中将 64 位 bmp 文件转换为数组

Posted

技术标签:

【中文标题】在 C/C++ 中将 64 位 bmp 文件转换为数组【英文标题】:Converting 64-bit bmp file to array in C/C++ 【发布时间】:2013-09-12 12:32:36 【问题描述】:

嗯,我是 C++ 的新手,已经两天没找例子和解释了,我尝试了不同的库,但我做不到,所以我只是寻求帮助。

我有一张 .bmp 格式的图片,我知道高度和长度,我想在我的程序中用作二维数组。

所以我找到了this code,但它不起作用。问题是我的图像是 64 bpp,虽然视觉上是单色的。

我读过the documentation,但我不明白,因为我在 C++ 方面的技能很差,以及与低级编程相关的一切。

您认为可以将之前的代码改编为每像素 64 位的 bmp 图像吗?

【问题讨论】:

修改 fread()...和 ​​for 循环 【参考方案1】:

据我所知,位图文件格式不支持每个组件 64 位。我不知道任何允许这种格式的文件格式(如果不存在,我会感到惊讶)。

我很难理解为什么图像格式组件需要如此 VAST 范围。

编辑:鉴于您的评论,是的,完全可以修改该代码。尽管值得注意的是 0..63(64 色阶)是 6 位的。不过,我认为浪费了 2 位。

如果是灰度,分量是8bpp就很简单了。基本上你需要的存储是宽*高字节。

char* pBitmap = malloc( bmp.width * bmp.height );

然后,您可以将像素直接读取到上面的字符缓冲区中,读取单个宽度 * 高度。

编辑 2

好的,每个组件 16 位,有 4 个组件,你需要这样的结构:

struct Pixel16RGBA

    unsigned short r;
    unsigned short g;
    unsigned short b;
    unsigned short a;
;

然后你会分配如下:

Pixel16RGBA* pBitmap = (Pixel16RGBA)malloc( bmp.width * bmp.height * 4 * sizeof( unsigned short ) );

然后,您可以像以前一样使用上面 malloc 中计算的大小来读取整个图像。

【讨论】:

你把矛头指向了我一定误解了的东西。因为我觉得我错了。我的图像的颜色深度为 64,这意味着她是 64/8 = 每像素 8 位,8 bpp 而不是我说的 64,不是吗? 其实色深就是每像素的位数。因此,我尝试打开的是 64 bpp 图像。根据研究,共有 65,536 种颜色的四个通道。但是关于这个主题的文档并不丰富。 @user2772576: 65536 个色度为 2^16,因此每通道 16 位……所以是的,它是 64bpp 图像,但每像素 16 位。不过,由于它的灰度,您可以轻松地将其存储为 1 个 16 位通道。 哎呀,我的意思是每个组件 16 位而不是像素

以上是关于在 C/C++ 中将 64 位 bmp 文件转换为数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中将图像从 base 64 转换为它们的文件类型?

在C#中将int数组转换为BMP

在 ASP.net 中将 BMP 转换为 PDF 的最简单方法是啥

是否值得在 spark 数据帧中将 64 位整数转换为 32 位(16 位)整数?

在 C 中将 32 位应用程序转换为 64 位应用程序

如何在 node.js 中将位字符串转换为 base64?