Java 如何解压缩png文件
我获得图像png,此图像已使用以下方法进行压缩: 前两个像素和所有奇数像素都是假像素:Java 如何解压缩png文件,java,image,image-processing,png,Java,Image,Image Processing,Png,我获得图像png,此图像已使用以下方法进行压缩: 前两个像素和所有奇数像素都是假像素: 第一像素实际上是一个整数,表示为构建解压缩图像必须重复的像素颜色总数 第二像素是一个整数,用于确定解压缩后图像的高度(其宽度与压缩图像的宽度相同) 第三像素和所有后续奇数像素(n>=1的像素[2n+1])是整数,表示要在以下像素(n>=1的像素[2n+2]上执行的重复次数 我正在尝试获取有关PNG文件的信息 BufferedImage img= ImageIO.read(new File("D://rle
- 第一像素实际上是一个整数,表示为构建解压缩图像必须重复的像素颜色总数李>
- 第二像素是一个整数,用于确定解压缩后图像的高度(其宽度与压缩图像的宽度相同)李>
- 第三像素和所有后续奇数像素(n>=1的像素[2n+1])是整数,表示要在以下像素(n>=1的像素[2n+2]上执行的重复次数
BufferedImage img= ImageIO.read(new File("D://rle.png"));
Raster raster=img.getData();
int w=raster.getWidth();
int h=raster.getHeight();
我正在寻找获取像素数据的最快方法,以及使用此方法解压缩此图像的方法。在发布此图像之前或之后,您已收到或未收到(或未向我们提供)正确的解包说明,或者(可能)此图像已经过一些处理,例如重新采样或调整大小
- 图像为常规真彩色+alpha PNG,258 x 98像素
- 根据其“文本”,它是用“软件:Microsoft Office”创建的。它包含一个1字节的sRGB块,其余的都是IDAT块——普通数据
- 普通数据解压为101234字节,这是图像大小的正确数字
- “第一个像素实际上是一个整数”——“第一个像素”的值是
。最后一个字节01 5A A5 FF
不重要;这是图像alpha,这是所有像素的FF
。其余字节可以读取为大端(10836481)或小端(88741)FF
- “第二个像素是一个决定高度的整数”——“第二个像素”的值是
。这将是一个526467或8587272像素的“高度”——由你自己选择08 83 FF
- “第三像素[…]是表示重复次数的整数”,那么,第三像素的RGBA值为
。你能指出哪个字节是整数值吗?选择其中一个会产生不好的结果(图像不是预期的“大小”,并且无论如何都无法识别为图像);使用完整的3字节值1841454或3021084对于普通的RLE重复值来说似乎有点太多了1C 19 2E FF
在获得正确图像的链接后 好的,它按照原始规格工作。第一个“像素”值将被解释为一个3字节的整数,即Big-Endian。第一个值是25258——要解压缩的重复/数据对的数量。下一个值是400,即新的图像高度。请注意,提供两者实际上是多余的;但是您应该使用这两种方法来验证您的算法 在您自己的尝试中,您正在获取指向“原始数据”(正确)的指针,并读取原始宽度(同样正确)。但是,正如指南所述,应该从原始数据中读取高度
编写一个函数
read\u 3bytes\u as\u int
,返回下一个要读取的“值”。使用此项可获得(a)“未包装”长度,(b)新高度,以及(c)每次重复计数。最后一个应该在循环中:读取重复计数,然后读取RGB像素并将其重复写入输出文件。记下您读取的像素/对数,以便知道何时停止。为什么会有人实施这样的模糊处理方案?通常,PNG文件已经被zLib压缩了。我不知道为什么,但我想解压。唉——除非我的高中法语欺骗了我,否则你的翻译似乎是正确的。这就是他们在这个问题上说的全部吗?要检查实际的RLE数据,可以在Photoshop中打开PNG并另存为“.RAW”文件。这样,PNG编码就不存在了。在发布之前,您正确地调整了图像大小,这是具有正确数据的图像:isn.codelab.info/site/assets/files/1531/rle.PNG您能重新计算吗谢谢,我的翻译很好我保存为“.RAW”,无论如何不能识别为图像)是的,但这是因为原始数据本身是经过RLE压缩的。现在要睡觉了,如果可以的话,我明天会检查原始文件。png的签名呢?