我得到图像png,这个图像已经使用以下方法压缩:
前两个像素和所有奇数像素都是假像素:
我试图获取有关PNG文件的信息。
BufferedImage img= ImageIO.read(new File("D://rle.png"));
Raster raster=img.getData();
int w=raster.getWidth();
int h=raster.getHeight();
我正在寻找获取像素数据的最快方法以及使用此方法解压缩此图像的方法。
答案 0 :(得分:1)
您有过,或者您没有给过(或者没有给我们)正确的拆包说明,或者(可能)此图片在发布之前或之后经过了一些处理,例如重新取样或调整大小这里。
照顾预赛。现在解码原始数据;这里出现了差异。
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
。你能指出哪个字节是'整数'吗?挑选任何一个都会产生不良结果(图像不是预期的'尺寸',并且无论如何都无法识别为图像);使用完整的3字节值1,841,454或3,021,084对于普通的RLE重复值来说似乎有点过分。好的,它符合原始规范。第一个'像素'值将被解释为3字节整数Big Endian。第一个值是25,258 - 要解压缩的重复/数据对的数量。下一个值是400,即新的图像高度。请注意,提供两者实际上是多余的;但你应该用两者来验证你的算法。
在您自己的尝试中,您正在获取指向“原始数据”(正确)并读取原始宽度(也正确)的指针。但是,正如指南所述,应该从原始数据中读取 height 。
编写一个函数read_3bytes_as_int
,返回要读取的下一个“值”。使用它来获得(a)'解包'长度,(b)新高度,以及(c)每个重复计数。最后一个应该是循环:读取重复计数,然后读取RGB像素并将其重复写入输出文件。记下您读取的像素/对的数量,以便知道何时停止。