【问题标题】:python BMP/DIB byte slots , compression slotpython BMP/DIB字节槽,压缩槽
【发布时间】:2017-10-10 19:58:31
【问题描述】:

我正在尝试学习(通过我自己和 stackoverflow 的帮助)在打包和分发二进制数据时读取它们。我这样做是出于好奇,但我必须提前说,我没有在这个领域接受过适当的教育,我所知道的一切都是我在网上找到的和试错类的工作。

为了准备这项工作,我在 Photoshop 中制作了几个简单的 1 像素 32 位文件,用不同的颜色进行测试和比较,并帮助我区分不同的字节和位。并开始梳理 wikipedia 和 msdn 位图网页。

“文学”如果有人好奇 BMP/DIB header MSDN web page

我在标题的 DIB 部分中使用 4 个字节的压缩“槽”击中了“路障”。

我制作的临时函数返回值为 6 的小端整数。

这里是函数:

def BMP_compresion(fileobj): # bitmap compresion ??? i have no idea what the hell is this
    fileobj = manageFile(fileobj)
    fileobj.seek(34)
    comp = fileobj.read(4)
    toStart(fileobj) # returns the file to position 0 or closes the file if file needs to be closed
    return readNUMB(comp,False) # reads integer with struct.unpack

这个功能目前是临时的,正如之前所说的,我还在搞清楚。

现在我明白像素必须从原始文件像素定义转换(并且可能压缩),但我不知道 6 应该代表什么?

我什至认为这可能是错误的,“压缩”本身是一种压缩格式,当它转换为 bmp 时从另一种类型的图像传递过来(例如:1 - PNG、2-JPEG 等) .

我什至认为我把它弄错了,而不是让它成为整数,我应该得到原始二进制文件,这应该告诉我一些事情。

二进制:\x06\x00\x00\x00
作为二进制字符串:◦◦◦

这让我更加困惑。

在维基百科的文章中说:

索引彩色图像可以使用 4 位或 8 位 RLE 或 Huffman 1D 算法进行压缩。 OS/2 BITMAPCOREHEADER2 24bpp 图像可以使用 24 位 RLE 算法进行压缩。 16bpp 和 32bpp 图像始终未压缩存储。 请注意,如果需要,所有颜色深度的图像都可以在不压缩的情况下存储

在 msdn 网页中它说:

BMP BMP 是 Windows 用来存储独立于设备和独立于应用程序的图像的标准格式。给定 BMP 文件的每像素位数(1、4、8、15、24、32 或 64)在文件头中指定。每像素 24 位的 BMP 文件很常见。 BMP 文件通常不经过压缩,因此不太适合通过 Internet 传输。

所以,它通常不会被压缩……那么 6 代表什么? “这里什么都没发生,继续……”?

所以我的问题是:

是否有一些用于图像压缩的标准化代码? 可以帮助我通过这些字节槽进行导航吗?以后可以详细研究。 有没有人有任何链接或书籍可以指导我进一步完成这个任务?

【问题讨论】:

  • 当您编写fileobj.seek(34) 时,您是如何决定应该在文件中查找 34 个字节以获取 DIB 标头的?根据en.wikipedia.org/wiki/BMP_file_format,它是 14 个字节,而不是 34 个。
  • 压缩槽是在DIB头而不是BMP部分,所以实际上是在34号。在图像“upload.wikimedia.org/wikipedia/commons/c/c4/BMPfileFormat.png”中,您可以查看 DIB 标头,这是我用来参考的。我使用图像底部的字节偏移来导航。在我弄清楚如何为其创建一个函数来减轻我的痛苦之前,我会计算每个字节。
  • 不应该是30吧? BMP header是14,然后DIB header size、image width、image height、planes和bits per pixel是16,一共30。
  • 好吧,我之前提到的 1 个像素图像,我会告诉你 BMP、DIB 和像素网格的大小整个文件:76 字节 BMP 头部:14 字节 DIB 头部:56 字节像素网格:4字节EOF:2字节

标签: python bitmap header bmp dib


【解决方案1】:

首先,我需要寻找第 30 个字节而不是第 34 个字节。 其次,凯文太客气了,没有给我指出维基百科上的特定部分,说接下来的事情。

压缩方式(偏移量30)可以是:

0 :> BI_RGB : the file has no compression  
1 :> BI_RLE8 : Run length encoding ( 1 byte per pixel )  -> RLE
2 :> BI_RLE4 : Run length encoding ( nibble per pixel )  -> RLE
3 :> BI_BITFIELDS : Huffman 1D  
4 :> BI_JPEG : RLE-24  
5 :> BI_PNG : BITMAPV4INFOHEADER+: PNG image for printing  
6 :> BI_ALPHABITFIELDS : RGBA fields ( byte per field, sooo 1 byte per color )  
7 :> BI_CMYK : cmyk  
11 :> BI_CMYKRLE8: RLE-8
12 :> BI_CMYKRLE4 RLE-4

因此,由于我从压缩槽中获得了值 6,我知道我需要将像素网格读取为 RGBA 而不进行压缩。

【讨论】:

    猜你喜欢
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多