增强型图像裁剪

5

哪个Java库最适合进行裁剪?目的是在2倍缩放时保持裁剪图像的清晰度。当缩放到2倍级别时,裁剪图像的边缘变得模糊。我尝试使用Java高级成像(JAI)进行裁剪,并使用渲染提示来保持图像清晰度。我还尝试了RescaleDescriptor(JAI)来增强图像。但它仅适用于白色背景下的黑色粒子。是否有其他库可以使用?


你在裁剪之前进行了调整大小吗? - Andrew Thompson
不行。我只负责裁剪。 - aruns
所以,先做大小调整。我认为这应该很明显吧。 - Andrew Thompson
3个回答

8
使用Thumbnailator,可以使用以下代码裁剪原始图像并放大该区域:
Thumbnails.of("/path/to/image")
    .sourceRegion(Positions.CENTER, 100, 100)
    .scale(2.0)
    .resizer(Resizers.BICUBIC)
    .toFile("/path/to/cropped+zoomed-image");

上述代码将从源图像中心提取100px x 100px的区域,并使用双三次插值将其放大2.0倍,以生成一张没有锯齿边缘的平滑图像:bicubic interpolation

Source image (left) cropped and enlarged by Thumbnailator (right)
(来源: coobird.net)

尽管Thumbnailator是一个专门用于创建缩略图的库(因此得名),但通常也可以适应创建放大图像的需求。

完全透明:我是Thumbnailator的开发者。


很高兴终于见到你,coobird。我在我的网站上使用了你的库,它运行得非常好。感谢你创建了这样一个方便的工具。 - qualebs

4
在使用外部库之前,请尝试设置以下渲染提示(用于“正常”Swing渲染):
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                   RenderingHints.VALUE_INTERPOLATION_BILINEAR); // or .._BICUBIC

g.setRenderingHint(RenderingHints.KEY_RENDERING,
                   RenderingHints.VALUE_RENDER_QUALITY);

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                   RenderingHints.VALUE_ANTIALIAS_ON);

下面的代码生成了这张截图:
screenshot
public static void main(String[] args) throws IOException {
    BufferedImage o = ImageIO.read(new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png"));
    final BufferedImage image = o.getSubimage(220, 220, 80, 80);
    final int width  = image.getWidth() * 4;
    final int height = image.getHeight() * 4;

    JFrame frame = new JFrame("Test");
    frame.setLayout(new GridLayout(1, 2));

    frame.add(new JComponent() {
        public void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                                 RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
                                 RenderingHints.VALUE_RENDER_QUALITY);
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                 RenderingHints.VALUE_ANTIALIAS_ON);

            g2d.drawImage(image, 0, 0, width, height, null);
        }
    });
    frame.add(new JComponent() {
        public void paintComponent(Graphics g) {
            g.drawImage(image, 0, 0, width, height, null);
        }
    });

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(649, 351);
    frame.setVisible(true);
}

0

我推荐 ImageJ,这是一个非常好的图像处理库。

以下是一个裁剪的代码示例:

ImageProcessor ip = //... get the image processor to crop
ip.setRoi(left,top,width,height); //set the "Region Of Interest" (rectangle within the image) 
ImageProcessor ip2 = ip.crop();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接