算法 – 解析GIF栅格数据 – LZW

算法 – 解析GIF栅格数据 – LZW,第1张

概述我一直在尝试用 PHP解压缩GIF,似乎除了LZW解压缩之外,还有其他一切.我保存了显示的图像: 这张照片是3 x 5像这样: Blue Black BlackBlack Blue BlackBlack Black BlackWhite White WhiteWhite White White 我决定手动通过二进制文件并解析这个文件.手动解析的结果如下.我仍然坚持如何在这里解码栅格数据 我一直在尝试用 PHP解压缩GIF,似乎除了LZW解压缩之外,还有其他一切.我保存了显示的图像:

这张照片是3 x 5像这样:

Blue  Black BlackBlack Blue  BlackBlack Black BlackWhite White WhiteWhite White White

我决定手动通过二进制文件并解析这个文件.手动解析的结果如下.我仍然坚持如何在这里解码栅格数据.有人会分解光栅数据如何变成图像?我已经能够分解一个图像,但没有别的(不是这个图像).我已经发表了我的理解,这应该如何分解,但我显然是错误的.

01000111 G01001001 I01000110 F00111000 800111001 901100001 aScreen DescriptorWIDTH00000011 30000000000000101 50000000010010001 GCM (1),CR (001),BPP (001),CD = 2,colorS = 400000000 BGcolor Index00000000 Aspect RatioGCMBLUE00110101 | 5300000000 | 011000001 | 193WHITE11111111 | 25511111111 | 25511111111 | 255BLACK00000000 | 000000000 | 000000000 | 000000000 | 000000000 | 000000000 | 0Extension00100001 | 21Function Code11111001 | F9Length00000100 | 400000000000000000000000000000000Terminator00000000Local Descriptor00101100 headerXPOS00000000 | 000000000YPOS00000000 | 000000000WIDth00000011 | 300000000Height00000101 | 500000000Flags00000000 (LCM = 0,Interlaced = 0,Sorted = 0,Reserved = 0,Pixel Bits = 0)RASTER DATAInitial Code Size00000010 | 2Length00000101 | 5Data1000010001101110001001111100000101011101Terminator0000000000111011 | ;00000000

我的尝试

1000010001101110001001111100000101011101

初始码大小= 3
一次读2位

1000Append last bit to first (010)String becomes 010 or 2. 2 would be color # 3 or BLACK

在这一点上,我已经错了.第一种颜色应该是蓝色.

资源我一直在使用:

http://www.daubnet.com/en/file-format-gif
http://en.wikipedia.org/wiki/Graphics_Interchange_Format
http://www.w3.org/Graphics/GIF/spec-gif87.txt

@H_301_28@解决方法 GIF解析器

你说你想编写自己的GIF解析器,以了解它的工作原理.我建议您查看包含GIF阅读器的任何库的源代码,例如事件参考实现GIFLIB.相关的源文件是dgif_lib.c;启动at slurp进行解码,或跳到LZW decompression implementation.

以下是您的图像如何解码.

我认为问题是您将输入字节分成LZW代码错误.

颜色数量为(0b001 1)* 2 = 4.

代码大小从2 1 = 3位开始.

所以初始的字典是

000 = color 0 = [blue]001 = color 1 = [white]010 = color 2 = [black]011 = color 3 = [black]100 = clear dictionary101 = end of data

现在,GIF packs LZW codes into bytes in LSB-first order.因此,第一个代码被存储为第一个字节的3个最低有效位;第二个代码作为下一个3位;等等.在您的示例(第一个字节:0x84 = 10000100)中,前2个代码为100(清除)和000(蓝色).整个东西

01011101 11000001 00100111 01101110 10000100

被分成代码(在读取最高3位代码之后切换到4位组,111)为

0101 1101 1100 0001 0010 0111 0110 111 010 000 100

这解码为:

lastcode code 100      clear dictionary 000      output [blue] (1st pixel) 010  000 new code in table:              output 010 = [black]              add 110 = old + 1st byte of new = [blue black] to table 111  010 new code not in table:              output last string followed by copy of first byte,[black black]              add 111 = [black black] to table              111 is largest possible 3-bit code,so switch to 4 bits0110 0111 new code in table:              output 0110 = [blue black]              add 1000 = old + 1st byte of new = [black black blue] to table0111 0110 new code in table:              output 0111 = [black black]              add 1001 = old + 1st byte of new = [blue black black] to table...

所以输出开始(包装到3列):

blue  black blackblack blue  blackblack black ...

这是你想要的.

总结

以上是内存溢出为你收集整理的算法 – 解析GIF栅格数据 – LZW全部内容,希望文章能够帮你解决算法 – 解析GIF栅格数据 – LZW所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1143990.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存