gpt4 book ai didi

c++ - 使用正确的结构将 BMP 读入内存

转载 作者:行者123 更新时间:2023-11-28 01:07:25 25 4
gpt4 key购买 nike

我目前正在做一个隐写术项目(为我自己)。我已经编写了一些代码,但在考虑之后,我知道有更好的方法可以完成我想做的事情。

另外 - 这是我第一次使用动态内存分配和二进制文件 I/O。

这是我在 BMP 图像中隐藏文本文件的代码:Link to code

另请注意,在此代码中我没有使用 LSB 来存储消息,而是替换了 alpha 字节,假设它是每像素 32 位 (bbp) 图像。如果图像中有 1、4、8、16、24 bpp,这就是为什么这不会很灵活的另一个原因。例如,如果它是 24 bbp,alpha channel 将是 6 位,而不是 1 字节。

我的问题是使用结构将整个 BMP 读入内存的最佳方法是什么?

我是这样看的:

  • 读取 BITMAPFILEHEADER
  • 读取 BITMAPINFOHEADER
  • 读取 ColorTable(如果有的话)
  • 阅读 PixelArray

我知道如何读取两个标题,但 ColorTable 让我感到困惑,我不知道 ColorTable 的大小,或者根本不知道图像中是否有 ColorTable。

此外,在 PixelArray 之后,维基百科说可能有一个 ICC 颜色配置文件,我怎么知道它存在? Link to BMP File Format (Wikipedia)

另一件事,因为我需要知道标题信息才能知道 PixelArray 从哪里开始,所以我需要像上面显示的那样进行多次读取,对吧?

很抱歉提出所有问题,但我现在真的不确定该怎么做。

最佳答案

颜色表的大小由bV5ClrUsed决定。

仅当 bV5CSType == PROFILE_EMBEDDED 时,文件中才会出现 ICC 颜色配置文件。

The documentation here提供所有这些信息。

然后,24 位颜色表示 8 个红色、8 个绿色、8 个蓝色、0 个 alpha。您必须将其转换为 32 位 RGBA 才能获得任何 alpha channel 。

最后,alpha channel 确实会影响图像的显示,因此您不能随意将其用于隐写术。你真的最好使用所有 channel 的最低有效位(也许不是所有像素)。

关于c++ - 使用正确的结构将 BMP 读入内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5443870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com