Java 如何解压缩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

我获得图像png,此图像已使用以下方法进行压缩:

前两个像素和所有奇数像素都是假像素:

  • 第一像素实际上是一个整数,表示为构建解压缩图像必须重复的像素颜色总数
  • 第二像素是一个整数,用于确定解压缩后图像的高度(其宽度与压缩图像的宽度相同)
  • 第三像素和所有后续奇数像素(n>=1的像素[2n+1])是整数,表示要在以下像素(n>=1的像素[2n+2]上执行的重复次数
我正在尝试获取有关PNG文件的信息

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
    。最后一个字节
    FF
    不重要;这是图像alpha,这是所有像素的
    FF
    。其余字节可以读取为大端(10836481)或小端(88741)
  • “第二个像素是一个决定高度的整数”——“第二个像素”的值是
    08 83 FF
    。这将是一个526467或8587272像素的“高度”——由你自己选择
  • “第三像素[…]是表示重复次数的整数”,那么,第三像素的RGBA值为
    1C 19 2E FF
    。你能指出哪个字节是整数值吗?选择其中一个会产生不好的结果(图像不是预期的“大小”,并且无论如何都无法识别为图像);使用完整的3字节值1841454或3021084对于普通的RLE重复值来说似乎有点太多了

在获得正确图像的链接后 好的,它按照原始规格工作。第一个“像素”值将被解释为一个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的签名呢?