【问题标题】:Similar library to TinyPNG for Java - compress image size类似于 TinyPNG for Java 的库 - 压缩图像大小
【发布时间】:2014-09-21 19:54:41
【问题描述】:

我正在开发一个允许用户上传图像并对其进行裁剪的网站。 我将每个图像都转换为 .PNG 以获得更好的质量。我遇到的问题是图片大小。

如果我上传一个 200 kb 的图片,在裁剪并使其成为 PNG 后,它有 600 kb。这对我来说不是一个解决方案,因为图像作为 BLOB 存储在数据库中,并且网站加载速度较慢。

我正在尝试找到一种方法来压缩 png,使其尺寸更小,而不会降低质量。

我找不到此问题的任何库或解决方案。我需要像 TinyPNG 这样的 Java 工具。

这就是我的做法:

    BufferedImage resizedImage = resizeImage(image,extension,width,height); 
    System.out.println("dimensiuni:" + resizedImage.getHeight()+ "x" + resizedImage.getWidth()); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write( resizedImage, "png", baos );
    baos.flush();
    byte[] imageInByte = baos.toByteArray();
    baos.close();

这是resizeImage函数:

    public BufferedImage resizeImage(BufferedImage image, String extension, int targetWidth, int targetHeight) {


    int type = (image.getTransparency() == Transparency.OPAQUE) ?
            BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;

        BufferedImage ret = (BufferedImage)image;
        int w, h;

            w = image.getWidth();
            h = image.getHeight();


        do {
            if (w > targetWidth) {
                w /= 2;
                if (w < targetWidth) {
                    w = targetWidth;
                }
            }

            if ( h > targetHeight) {
                h /= 2;
                if (h < targetHeight) {
                    h = targetHeight;
                }
            }

            BufferedImage tmp = new BufferedImage(w, h, type);
            Graphics2D g2 = tmp.createGraphics();
            g2.setComposite(AlphaComposite.Src);
            g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g2.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHints.VALUE_RENDER_DEFAULT);
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
            g2.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
            g2.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);


            g2.drawImage(ret, 0, 0, w, h, null);
            g2.dispose();

            ret = tmp;

            tmp.flush();


        } while (w != targetWidth || h != targetHeight);

        return ret; 
}

帮帮我!!

【问题讨论】:

  • 您无法通过将图像转换为 PNG 来提高图像质量。
  • 我测试过。如果我将其调整为更小的尺寸(从 500x500 到 400x400),质量会大大降低。如果我将图像保存为 PNG,则质量还可以。
  • 您是否有理由通过 Graphics2D 发送此内容,而不是使用 ImageMagick 等专用图像处理工具/库?
  • 我使用了 Graphics2D,因为这样我设置了 RenderingHints 以获得更好的质量。这就是我在某个地方的stackoverflow上找到的。我是这个领域的新手,对不起。我不知道最好的解决方案。

标签: java png image-compression


【解决方案1】:

在tinypng 网站上,他们解释了它是如何工作的问题,即他们如何压缩图像,如下所示:

它是如何工作的?

很好的问题!当您上传 PNG(便携式网络图形)时 文件中,图像中相似的颜色会组合在一起。这种技术是 称为“量化”。通过减少颜色数量,24 位 PNG 文件可以转换为更小的 8 位索引彩色图像。全部 不必要的元数据也被删除了。结果更好的 PNG 文件 100% 支持透明度。吃你的蛋糕,也吃吧!

他们确实为此使用了一些库,

您可以使用http://pngquant.org/ 来压缩或缩小图像大小,

在另一个 SO 问题中,有人回答 tinypng 也使用 pngquant 库,但我不知道它的真相有多远,但你也可以在 Java 中使用这个库,

在 pngquant 网站中,他们提供了 java 库链接,请看一下,我提供了与网站中提供的相同的 github 存储库链接:

https://github.com/ImageOptim/libimagequant/tree/master/org/pngquant

上面的库基本上是用c/c++写的,所以它使用JNI(Java Native Interface)这个接口来连接c/c++和Java。

【讨论】:

    猜你喜欢
    • 2020-04-27
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 2013-09-03
    • 1970-01-01
    相关资源
    最近更新 更多