在 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 转换为它们的文件类型?
在 ASP.net 中将 BMP 转换为 PDF 的最简单方法是啥