PNG编码器 - 添加自己的过滤器实现

时间:2011-04-13 23:41:25

标签: java graphics compression png javax.imageio

我目前正在开发自己的PNG过滤器。我使用神经网络尝试创建比当前现有PNG过滤器更好的预测:

  • 0 - 无
  • 1 - Sub
  • 2 - Up
  • 3 - 平均
  • 4 - Paeth
  • 5 - 我的实施(使用神经网络预测)

有关详细信息:http://www.w3.org/TR/PNG/#9Filters

我已经查看了几个库:

  • pngcrush (在c ..中实施)
  • Keypoint - PngEncoder (是我目前最喜欢的)
  • ObjectPlanet - PngEncoder (我必须为src支付1000美元......:P)

还有更多。但我现在的问题是,您是否知道其他一些PNG编码器(用Java编写)哪里可以轻松添加自己的过滤器实现,还是有其他可能使用我自己的过滤器?

非常感谢您的回答!

2 个答案:

答案 0 :(得分:8)

前段时间我做了一个小的纯Java PNG库(编码器 - 解码器)
http://code.google.com/p/pngj/

它很小,非常完整(不完全),它没有第三方库的依赖,并且代码可用(我希望,易于理解)。如果要实现自定义过滤器,可以在那里挖掘。如果您需要帮助,可以问我。

但请记住(正如其他答案所指出的)PNG标准不支持自定义过滤器,只有您能够读取您的编码图像。

答案 1 :(得分:2)

这不是问题的答案,但更多的是“它不会以这种方式运作”。

您链接的PNG specification部分定义了过滤器方法0 ,以及此方法的过滤器类型(函数)列表。此列表已修复:

  

过滤方法0确切地指定了这五种过滤器类型的集合,但这不应该是   延长。这确保解码器不需要解压缩数据以确定是否   它包含不受支持的过滤器类型:在IHDR中检查过滤器方法就足够了。

所以,你不能简单地在这里添加神经网络预测。

您可以做的是创建一个新的Filter方法(方法1,或者类似 - 但请参阅Section 4.9),然后可以包含您的神经网络过滤器类型。

但问题是,那么每个想要阅读你的软件产生的PNG的软件都需要支持这种新的过滤方法。因此,如果您不想仅仅为了内部图像存储而这样做,那么这不是一件有用的事情。


您实际可以使用神经网络的地方,是为每个扫描线选择正确的滤波器类型(给定的五个滤波器类型),以便生成的gzip压缩数据流尽可能小(或有效或......)