Resize Image
От: tzragravorox  
Дата: 22.12.06 13:53
Оценка:
Друзя.

Такая зодача:

Есть ImageIcon читаю картинку из БД(из блоб и даю прочитанние байти ImageIcon-у, в блоб написан JPG).

Так вот, но оказоваетса что кортинки слишком большие и не помешаютса на форме, вопрос к профи как сделать ее мальенкой, не резать а уменшать как в "-"-авом зуме(если не затруднит с кодом пожалуста).

Большое спасибо.

tzragravorox — Copyright (C) 2007

Re: Resize Image
От: Blazkowicz Россия  
Дата: 22.12.06 14:26
Оценка: 3 (1)
Здравствуйте, tzragravorox, Вы писали:

T>Есть ImageIcon читаю картинку из БД(из блоб и даю прочитанние байти ImageIcon-у, в блоб написан JPG).


T>Так вот, но оказоваетса что кортинки слишком большие и не помешаютса на форме, вопрос к профи как сделать ее мальенкой, не резать а уменшать как в "-"-авом зуме(если не затруднит с кодом пожалуста).


http://java.sun.com/products/java-media/2D/reference/faqs/index.html#Q_How_do_I_create_a_resized_copy
Re[2]: Resize Image
От: n0name2  
Дата: 22.12.06 15:02
Оценка: 13 (3)
Здравствуйте, Blazkowicz, Вы писали:

B>http://java.sun.com/products/java-media/2D/reference/faqs/index.html#Q_How_do_I_create_a_resized_copy


Плохо этот код ресайзит (по крайней мере в меньшую сторону). Несмотря ни на какие хинты.
Долго мучался с этим, в конце концов нашел что можно сделать вот так:


    private static void rescale(@NotNull InputStream input, @NotNull OutputStream output, int tw, int th) throws IOException {
        // Create the image
        BufferedImage image = new BufferedImage(tw, th, BufferedImage.TYPE_INT_RGB);
        // Create the graphics
        Graphics2D graphics = image.createGraphics();
        try {
            // Set rendering hints
            graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
            // Open the source image
            @NotNull BufferedImage source = ImageIO.read(input);
            // Get width & geight
            int w = source.getWidth(), h = source.getHeight();
            // Calculate the scale
            double scale = Math.min((double)tw/(double)w, (double)th/(double)h);
            // Calculate the coordinates
            int x = (int)(((double)tw - (double)w * scale) / 2.0d), y = (int)(((double)th - (double)h * scale) / 2.0d);
            // Get the scaled instance
            @NotNull Image scaled = source.getScaledInstance((int)(w * scale), (int)(h * scale), Image.SCALE_SMOOTH);
            // Set the color
            graphics.setColor(Color.WHITE);
            // Paint the white rectangle
            graphics.fillRect(0, 0, tw, th);
            // Draw the image
            graphics.drawImage(scaled, x, y, null);
        } finally {
            // Always dispose the graphics
            graphics.dispose();
        }
        // Write the rescaled image
        ImageIO.write(image, "png", output);
    }
Re[3]: Resize Image
От: Blazkowicz Россия  
Дата: 22.12.06 15:05
Оценка:
Здравствуйте, n0name2, Вы писали:

B>>http://java.sun.com/products/java-media/2D/reference/faqs/index.html#Q_How_do_I_create_a_resized_copy


N>Плохо этот код ресайзит (по крайней мере в меньшую сторону). Несмотря ни на какие хинты.


Примеры есть где-то посмотреть для сравнения?
Re[4]: Resize Image
От: n0name2  
Дата: 22.12.06 15:30
Оценка: 22 (3)
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, n0name2, Вы писали:


B>>>http://java.sun.com/products/java-media/2D/reference/faqs/index.html#Q_How_do_I_create_a_resized_copy


N>>Плохо этот код ресайзит (по крайней мере в меньшую сторону). Несмотря ни на какие хинты.


B>Примеры есть где-то посмотреть для сравнения?


Re[5]: Resize Image
От: Trean Беларусь http://axamit.com/
Дата: 22.12.06 16:32
Оценка: 2 (1)
Здравствуйте, n0name2, Вы писали:

N>Здравствуйте, Blazkowicz, Вы писали:


B>>Здравствуйте, n0name2, Вы писали:


B>>>>http://java.sun.com/products/java-media/2D/reference/faqs/index.html#Q_How_do_I_create_a_resized_copy


N>>>Плохо этот код ресайзит (по крайней мере в меньшую сторону). Несмотря ни на какие хинты.


B>>Примеры есть где-то посмотреть для сравнения?


N>


Потому что aliasing. Физический принцип такой, максимальная представимая частота на изображении равна половине частоты дискретизации. Когда вы ее допустим уменьшаете в два раза по осям при масштабировании, максимальная представимая частота уменьшается в два раза из-за этого и возникает данный артефакт. Следствие из теоремы Котельникова.
Один из способов — пройтись перед уменьшением по изображению фильтром гаусса (gaussian smoothing) c sigma = 1.0 (для 0.5x zoom) и все будет как надо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.