我正在一个允许用户上传图像并对其进行裁剪的网站上。我将每个图像都转换为.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;
}
帮帮我!
在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本机接口),该接口将c/c++
与Java
连接在一起。