【发布时间】: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