作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我得到图像png,该图像已使用以下方法压缩:
前两个像素和所有奇数像素都是假像素:
我正在尝试获取有关 PNG 文件的信息。
BufferedImage img= ImageIO.read(new File("D://rle.png"));
Raster raster=img.getData();
int w=raster.getWidth();
int h=raster.getHeight();
我正在寻找获取像素数据的最快方法以及使用此方法解压缩该图像的方法。
最佳答案
在发布之前或之后,您已经收到或没有收到(或未向我们提供)正确的拆包说明,或者(可能)该图像经过了某些处理,例如重新采样或调整大小在这里。
这就完成了预赛。现在开始解码原始数据;差异就出现了。
01 5A A5 FF
。最后一个字节FF
不重要;它是图像 Alpha,所有像素都是 FF
。其余字节可以按 Big Endian (10,836,481) 或 Little Endian (88,741) 读取。08 08 83 FF
。这将是 526,467 或 8,587,272 像素的“高度”——您可以选择。1C 19 2E FF
。你能指出哪个字节是“那个”整数值吗?选择任何一个都会产生不好的结果(图像不是预期的“大小”,并且无论如何都无法识别为图像);对于普通的 RLE 重复值来说,使用完整的 3 字节值 1,841,454 或 3,021,084 似乎有点太多了。好的,它按照原始规范工作。第一个“像素”值将被解释为 3 字节整数(Big Endian)。第一个值是 25,258——要解包的重复/数据对的数量。下一个值是 400,即新的图像高度。请注意,提供两者实际上是多余的;但您应该使用两者来验证您的算法。
在您自己的尝试中,您正在获取指向“原始数据”的指针(正确)并读取原始宽度(也是正确的)。但正如指南所述,高度应该从原始数据中读取。
编写一个函数read_3bytes_as_int
,返回下一个要读取的“值”。使用它来获取 (a)“解压”长度、(b) 新高度和 (c) 每个重复计数。最后一个应该是循环:读取重复计数,然后读取 RGB 像素并将其重复写入输出文件。记录您读取的像素/对的数量,以便您知道何时停止。
关于java - 如何解压png文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21005466/
我是一名优秀的程序员,十分优秀!