Друзя.
Такая зодача:
Есть ImageIcon читаю картинку из БД(из блоб и даю прочитанние байти ImageIcon-у, в блоб написан JPG).
Так вот, но оказоваетса что кортинки слишком большие и не помешаютса на форме, вопрос к профи как сделать ее мальенкой, не резать а уменшать как в "-"-авом зуме(если не затруднит с кодом пожалуста).
Большое спасибо.
Здравствуйте, 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
Здравствуйте, 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);
}
Здравствуйте, n0name2, Вы писали:
B>>http://java.sun.com/products/java-media/2D/reference/faqs/index.html#Q_How_do_I_create_a_resized_copy
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>Примеры есть где-то посмотреть для сравнения?
Здравствуйте, 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) и все будет как надо.