Frage Erweiterte Bildbeschneidung


Welches ist die beste Java-Bibliothek, zum des Ausschnitts zu tun. Ziel ist, die Klarheit des gecroppten Bildes mit 2x Zoom beizubehalten. Die Seiten des geernteten Bildes werden beim Zoomen auf 2X Niveau unscharf. Ich versuchte Java Advanced Imaging (JAI), um mit dem Rendern zu beschneiden Hinweise. Ich habe auch RescaleDescriptor (JAI) versucht, um das Bild zu verbessern. Aber es funktioniert nur für ein schwarzes Partikel in einem weißen Hintergrund. Gibt es irgendwelche anderen Bibliotheken, die ich verwenden kann?


5
2018-05-09 12:27


Ursprung


Antworten:


Verwenden Daumenbildnerkann man das Originalbild zuschneiden und mit folgendem Code in diese Region hineinzoomen:

Thumbnails.of("/path/to/image")
    .sourceRegion(Positions.CENTER, 100, 100)
    .scale(2.0)
    .resizer(Resizers.BICUBIC)
    .toFile("/path/to/cropped+zoomed-image");

Oben wird der zentrale 100 px × 100 px Bereich des Quellbildes genommen und mit einem Skalierungsfaktor von 2.0x vergrößert bikubische Interpolation zu einem glatten Bild ohne gezackte Kanten führen:

Quellbild (links) beschnitten und vergrößert mit Thumrnailator (rechts) http://coobird.net/img/zoom-in.jpg

Obwohl Thumbnailator eine Bibliothek ist, die sich auf die Erstellung von Thumbnails spezialisiert hat (daher der Name), kann sie normalerweise auch für die Erstellung von vergrößerten Bildern angepasst werden.

Vollständige Offenlegung: Ich bin der Entwickler von Thumbnailator.


8
2018-05-09 15:04



Bevor Sie externe Bibliotheken verwenden, versuchen Sie, diese Rendering-Hinweise zu setzen (für das "normale" Swing-Rendering):

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);

Der folgende Code erzeugt diesen Screenshot:

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);
}

5
2018-05-09 12:41



ich empfehle BildJeine großartige Bibliothek für die Bildverarbeitung.

Hier ist ein Codebeispiel zum Zuschneiden:

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();

0
2018-05-09 12:32