0

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

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

这是我在 BMP 图像中隐藏文本文件的代码:链接到代码

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

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

这就是我的看法:

  • 读取位图文件头
  • 阅读 BITMAPINFOHEDER
  • 阅读 ColorTable(如果有的话)
  • 读取 PixelArray

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

此外,在 PixelArray 之后,维基百科说可能有一个 ICC 颜色配置文件,我怎么知道存在一个?链接到 BMP 文件格式(维基百科)

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

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

4

1 回答 1

3

颜色表的大小由 决定bV5ClrUsed

ICC 颜色配置文件仅在bV5CSType == PROFILE_EMBEDDED.

此处的文档提供了所有这些信息。

那么,24 位颜色意味着 8 个红色、8 个绿色、8 个蓝色、0 个 alpha。您必须将其转换为 32 位 RGBA 才能拥有任何 Alpha 通道。

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

于 2011-03-26T17:49:47.093 回答