san*_*ity 5 java graphics image-processing graphics2d
这是原始图像:http://rank.my/public/images/uploaded/orig-4193395691714613396.png
在这里,它缩小到300x225:
http://rank.my/public/images/uploaded/norm-4193395691714613396.png
在这里,它缩小到150x112:
http://rank.my/public/images/uploaded/small-4193395691714613396.png
正如你所看到的,300x225看起来非常糟糕,150x112看起来很糟糕.这是我用来缩小图像的代码:
private static BufferedImage createResizedCopy(final BufferedImage source, final int destWidth,
final int destHeight) {
final BufferedImage resized = new BufferedImage(destWidth, destHeight, source.getType());
final Graphics2D bg = resized.createGraphics();
bg.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
bg.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
bg.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
final float sx = (float) destWidth / source.getWidth();
final float sy = (float) destHeight / source.getHeight();
bg.scale(sx, sy);
bg.drawImage(source, 0, 0, null);
bg.dispose();
return resized;
}
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?图像缩放不一定非常快,质量绝对优先于速度.我使用了错误的技术吗?
有三种方法可以解决降尺度问题.首先是分多步完成,每步减少不超过75%.第二种是在调整大小之前模糊图像; 它越萎缩,你就越需要模糊.第三种方法是使用一种方法,该方法使用超过2x2到4x4像素块的过滤器,这些块使用的是天真的双线性或双三次插值方法.随着缩小因子越来越大,滤镜使用的像素块也应该越大,否则你会得到如你所见的锯齿伪像.