Улучшенная обрезка изображений - PullRequest
5 голосов
/ 09 мая 2011

Какая библиотека Java лучше всего подходит для обрезки. Цель состоит в том, чтобы сохранить четкость обрезанного изображения при 2-кратном увеличении. Стороны обрезанного изображения становятся размытыми при масштабировании до 2-кратного уровня. обрезать с подсказками рендеринга. Я также попытался RescaleDescriptor (JAI), чтобы улучшить изображение. Но это работает только для черной частицы на белом фоне. Есть ли другие библиотеки, которые я могу использовать?

Ответы [ 3 ]

8 голосов
/ 09 мая 2011

Используя Thumbnailator , можно обрезать исходное изображение и увеличить этот регион с помощью следующего кода:

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

Приведенное выше будет принимать центральную область 100 × 100 пикселей.исходное изображение и увеличьте его с коэффициентом масштабирования 2,0x, используя бикубическую интерполяцию , чтобы получить гладкое изображение без зубчатых краев:

Исходное изображение (слева) обрезано и увеличено наThumbnailator (справа) http://coobird.net/img/zoom-in.jpg

Хотя Thumbnailator - это библиотека, которая специализируется на создании миниатюр (отсюда и название), ее обычно можно адаптировать и для создания увеличенных изображений.

Полное раскрытие:Я разработчик Thumbnailator.

5 голосов
/ 09 мая 2011

Перед использованием внешних библиотек попробуйте установить следующие подсказки рендеринга (для "обычной" рендеринга свинга):

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 голосов
/ 09 мая 2011

Я рекомендую 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...