gpt4 book ai didi

java - 如何解压png文件

转载 作者:行者123 更新时间:2023-12-01 13:38:56 25 4
gpt4 key购买 nike

我得到图像png,该图像已使用以下方法压缩:

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

  • 第一个像素实际上是一个整数,表示构建解压缩图像时必须重复的像素颜色总数;
  • 第二个像素是一个整数,决定解压后图像的高度(其宽度与压缩图像的宽度相同);
  • 第三个像素和所有后续奇数像素(n> = 1 的像素 [2n +1])是表示要对后续像素(n> = 的像素 [2n +2])执行的重复次数的整数1)。

我正在尝试获取有关 PNG 文件的信息。

BufferedImage img= ImageIO.read(new File("D://rle.png"));
Raster raster=img.getData();
int w=raster.getWidth();
int h=raster.getHeight();

enter image description here

我正在寻找获取像素数据的最快方法以及使用此方法解压缩该图像的方法。

最佳答案

在发布之前或之后,您已经收到或没有收到(或未向我们提供)正确的拆包说明,或者(可能)该图像经过了某些处理,例如重新采样或调整大小在这里。

  • 该图像是常规真彩色 + alpha PNG,258 x 98 像素。
  • 根据其“文本”,它是使用“软件:Microsoft Office”创建的。它包含一个 1 字节的 sRGB block ,其余都是 IDAT block ——纯数据。
  • 纯数据解压缩为 101234 字节,这是图像大小的正确数字。

这就完成了预赛。现在开始解码原始数据;差异就出现了。

  • “第一个像素实际上是一个整数”——“第一个像素”值为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 像素的“高度”——您可以选择。
  • “第三个像素 [..] 是表示重复次数的整数”,那么,第三个像素的 RGBA 值为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com