Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Пропорционально уменьшить картирнку. Как?


Автор: Foli 17.2.2008, 15:22
Народ привет.

Есть след. задача.

Есть вэб страничка где юзер грузит фото сотрудника. На серваке в сервлете, нужно порезать картинку до нужного размера. Но, ПРОПОРЦИОНАЛЬНО!!! Для примера 3,5 x 4,5

Как это сделать? Всё работает но картинки разных размеров 

Автор: whoever 17.2.2008, 15:42
Так пропорционально или под определенные ширину И высоту?
Пропорционально - значит, сохранить соотношение ширины и высоты. Для этого фиксируй один из параметров. Например, для фиксированной ширины:
Код

BufferedImage originalImage = ImageIO.read(input);

int FIXED_WIDTH = 150;
int height = (int)Math.ceil((double)(originalImage.getHeight() * FIXED_WIDTH) / originalImage.getWidth());

BufferedImage smallImage = new BufferedImage(FIXED_WIDTH, height, BufferedImage.TYPE_3BYTE_BGR);
Graphics2D smallGraphics = smallImage.createGraphics();
smallGraphics.drawImage(originalImage.getScaledInstance(FIXED_WIDTH, height, Image.SCALE_SMOOTH), null, null);

ImageIO.write(smallImage, "jpg", new File("..."));


Автор: Foli 17.2.2008, 16:11
Цитата(whoever @ 17.2.2008,  15:42)
Так пропорционально или под определенные ширину И высоту?
Пропорционально - значит, сохранить соотношение ширины и высоты. Для этого фиксируй один из параметров. Например, для фиксированной ширины:

Нужно картинку непросто обрезать а уменьшить её так, что бы обьект X на картинке тоже уменьшился.

Можно тупо взять картинку и порезать до нужных размеров. 
Но при этом на  картинке будет уже половина машины а не целая. 
Как уменьшить картинку без потери частей области машины?

Автор: whoever 17.2.2008, 16:18
Приведенный код именно это и делает, сохраняя отношение ширина/высота.

Автор: Foli 17.2.2008, 16:41
Цитата(whoever @ 17.2.2008,  16:18)
Приведенный код именно это и делает, сохраняя отношение ширина/высота.

Что это за image?

Код

smallGraphics.drawImage(image.

Автор: whoever 17.2.2008, 16:47
Опечатка - там originalImage должно быть.

Автор: Foli 17.2.2008, 16:59
Цитата(whoever @ 17.2.2008,  16:47)
Опечатка - там originalImage должно быть.

Вот твой код: 

Код

File f = new File("C:\\2.jpg");
BufferedImage originalImage = ImageIO.read(f);
int FIXED_WIDTH = 150;
int height = (int) Math.ceil((double) (originalImage.getHeight() * FIXED_WIDTH) / originalImage.getWidth());
BufferedImage smallImage = new BufferedImage(FIXED_WIDTH, height, BufferedImage.TYPE_3BYTE_BGR);
Graphics2D smallGraphics = smallImage.createGraphics();
smallGraphics.drawImage(originalImage.getScaledInstance(originalImage.getWidth(), originalImage.getHeight(), originalImage.SCALE_SMOOTH), null, null);
ImageIO.write(smallImage, "jpg", new File("C:\\WWWWWWWWWWW.jpg"));


Это правильно: ?
Код

smallGraphics.drawImage(originalImage.getScaledInstance(originalImage.getWidth(), originalImage.getHeight(), originalImage.SCALE_SMOOTH), null, null);


Если да то я проверил его и картинка порезалась но половина машины на картинке обрезалось. Ну так где пропорциональное уменьшение изображения на какртинке? :(

Автор: whoever 17.2.2008, 17:18
Нет, это неверно. Метод getScaledInstance изменяет размеры изображения (но не обрезает). В качестве параметров передаются ширина и высота результирующего изображения и метод сжатия. Ты передаешь ширину-высоту исходного изображения, естественно изменения размера никакого не будет. Верно будет так:
Код

smallGraphics.drawImage(originalImage.getScaledInstance(FIXED_WIDTH, height, Image.SCALE_SMOOTH), null, null);

Автор: Foli 17.2.2008, 17:32
Цитата(whoever @  17.2.2008,  17:18 Найти цитируемый пост)
whoever


whoever спасибо друг! Всё работает. Йоохуууууу  smile  smile 

Автор: _Y_ 18.2.2008, 11:22
Всегдашняя проблема с масштабированием картинок для сети - как и сохранить пропорцию, и не обрезать изображение. ИМХО есть два решения:
1) Задавать только высоту или только ширину, а на веб-страничке картинку располагать так, чтобы изменение второго параметра не влияло на зрительное впечатление.
2) Уменьшать картинку по большему (в рамках пропорции) параметру, заполняя образовавшееся дополнительное поле белым (или фоном).
По сути оба метода дают почти один и тот же результат. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)