Java:通过低位深度的Socket发送BufferedImage

标签 java io image-manipulation bufferedimage

我认为标题已经足够了。 我有一个全质量的 BufferedImage,我想通过一个低输出流发送它 位深度。我不希望算法逐像素改变质量,因此它仍然是全质量。

因此,目标是通过 OuputStream 写入图像(具有全分辨率、全尺寸),这需要很少的字节数来写入。

谢谢,
马丁

最佳答案

您需要将图像数据编码为具有适合您的图像特征的格式。如果它是 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 种不同颜色的任意集合并且您切换到颜色映射(索引或调色板)格式,情况也是如此。您减少了字节数,但不会降低质量。

关于Java:通过低位深度的Socket发送BufferedImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2403769/

相关文章:

Android:无法显示多张图片

java - Hibernate不会自动创建表,但是当创建表时,它会将值插入表中

Java:在 Mac 上创建一个具有 777 权限的新目录

java - 如何在每一帧上获取相对于 JPanel 的鼠标位置

java - 获取另一个包中私有(private)包的包类

java - 在一个过程中多次保存 printWriter 的更新版本

java - 字节流如何工作?

c - 如何更改内核 I/O 缓冲区大小

css - 如何使用 CSS 在图像周围添加非矩形边框?

Python turtle 图章在 turtle 形状的图像处理后神秘消失