【问题标题】:Java: Send BufferedImage through Socket with a low bitdepthJava:通过具有低位深度的 Socket 发送 BufferedImage
【发布时间】:2010-03-08 18:38:47
【问题描述】:

我认为标题已经足够了。 我有一个完整质量的 BufferedImage,我想通过一个低输出流发送它 位深度。我不想要一个算法来逐个像素地改变质量,所以它仍然是一个完整的质量。

因此,我们的目标是通过 OuputStream 写入图像(以全分辨率、全尺寸),写入所需的字节数非常少。

谢谢,
马丁

【问题讨论】:

  • 您是否希望最小化发送的实际字节流?如果是这样,那么我认为您应该只使用 Java 中的许多图像编码器将图像编码为许多压缩的图像格式之一,例如(PNG - 无损)、JPG(有损)。
  • "bitdepth" 是每个像素的位数。你不想改变质量,但是“位深度”是怎么回事?

标签: java io image-manipulation bufferedimage


【解决方案1】:

您需要将图像数据编码为适合您的图像特征的格式。如果它是 24 位颜色并且有很多颜色并且您希望不损失任何质量,您可能会被 PNG 卡住,但请查看无损 JPEG 2000。

如果你能失去一些质量,那就试试

  1. 有损 JPEG 2000 - 比 JPEG 小得多,但质量损失相同
  2. 减少颜色数量并使用颜色映射格式

如果图像只有灰色或黑白数据,请确保将其编码为此类(8 位灰色或 1 位黑白)。然后,确保使用针对这种格式调整的编码器(例如带有 Group 4 的 TIFF 或 JBIG2)。

另一个不错的选择是从图像中删除所有不需要的元数据(或确保您的编码器没有放入任何元数据)。

如果您想坚持使用 Java 中的内容,您可能必须使用 TIFF、PNG 或 JPEG——有第三方图像编码器(例如,我的公司 Atalasoft 制作了这些高级图像的 .NET 版本编码器——也有 Java 供应商)

仅供参考:降低位深度通常意味着降低质量(除非降低没有意义)。例如,如果我有一个 24 位彩色图像,但所有颜色都是灰色(其中 R==G==B),那么减少到 8 位灰色不会降低质量。如果您的图像具有 256 种不同颜色的任何集合并且您切换到颜色映射(索引或调色板)格式,这也是正确的。您减少了字节数,但不会降低质量。

【讨论】:

    【解决方案2】:

    查看java.util.zip 包以了解有关压缩的所有信息:

    http://java.sun.com/developer/technicalArticles/Programming/compression/

    虽然 JPEG 和 PNG 已经以某种方式进行了压缩,但使用 Inflater 类,您可以减少字节数,同时保持图像的完全相同的质量。压缩已经压缩的格式通常并不重要。但是,如果您将多张图像组合在一起,则对它们进行膨胀非常重要(因为膨胀技术可以识别对象数据中的常见模式,从而减少重复,从而减少字节数)。

    【讨论】:

      猜你喜欢
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      相关资源
      最近更新 更多