类似于TinyPNG for Java的库 - 压缩图像大小

时间:2014-07-30 08:42:45

标签: java png image-compression

我正在开发一个允许用户上传图片并裁剪图片的网站。 我将每个图像转换为.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; 
}

帮助我!!

1 个答案:

答案 0 :(得分:0)

tinypng网站上,他们解释了如何压缩图像,请参见以下内容:

  

它如何工作?

     

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

当然,他们为此使用了一些库

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

在另一个SO问题中,有人回答tinypng也使用pngquant库,但是我不知道其中的真实程度,但是您也可以在Java中使用此库,

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

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

上面的库基本上是用c/c++编写的,因此它使用JNI(Java本机接口),该接口将c/c++Java连接起来。