В конечном результате важен конечный результат!

пятница, декабря 02, 2005

Масштабирование JPEG-изображений в ColdFusion

Думаю, что поклонники ColdFusion наверняка задумывались над насущным для некоторых дизайнеров, и не только, вопросом масштабирования изображений. Тема признаться достаточно сложная, а разобраться с теми компонентами, которые позволяют это делать не всегда удается... во всяком случае с первого раза.
Дык вот, на канале #coldfusion довелось понаблюдать за обсуждением данной проблемы и ее решением без установки дополнительных Java-библиотек - хватит и стандартных.

Итак, дабы в полной мере овладеть материалом - предлагаю заранее ознакомиться с документацией по com.sun.image.codec.jpeg.JPEGCodec (сразу предупреждаю, что материал не из самых легких для понимания... но ничего не поделаешь).

Итак, в качестве примера будет использована картинка, которая будет уменьшена в четыре раза - этого хватит для того, чтобы понять сам принцип и уже дальше самому барахтаться... :)

Итак, вот код (заключен в теги cfscript, но тут они вырезаны блоггером)


//это необходимо для дальнейшей работы с JPEG
JpegCodec = createObject("java", "com.sun.image.codec.jpeg.JPEGCodec");

//читаем файл
inputStream = createObject("java", "java.io.FileInputStream").init(expandPath("nissan.jpg"));

outputStream = createObject("java", "java.io.FileOutputStream").init(expandPath("nissan1.jpg"));

//декодируем JPEG
decoder = jpegCodec.createJPEGDecoder(inputStream);

//получаем изображение для масштабирования
image = decoder.decodeAsBufferedImage();

//масштабирует до 1/4 размера
height = round(image.getHeight() /4);
width = round(image.getWidth() / 4);

//это java.awt.image.Image, но нам нужно java.awt.image.BufferedImage!
scaledImage = image.getScaledInstance(JavaCast("int", width), JavaCast("int", height), image.SCALE_DEFAULT);

//создаем новый BufferedImage
newBufferedImage = createObject("java", "java.awt.image.BufferedImage").init(JavaCast("int", width), JavaCast("int", height), image.TYPE_INT_RGB);

//рисуем изображение в буфере
graphics = newBufferedImage.createGraphics();
graphics.drawImage(scaledImage, 0, 0, Javacast("null", ""));

//кодируем рисунок
encoder = jpegCodec.createJPEGEncoder(outputStream); encoder.encode(newBufferedImage);

//закрываем все это дело
outputStream.close();


Собственно показанный пример крайне лаконичен и не требует дополнительных комментариев кроме уже приведенных. Наслаждайтесь! :)

8 комментариев:

Nirth комментирует...

не посоветуешь книжек по колдфужену?
и если можно юрлник провайдера который представляет такие услуги =)

injun #576871 комментирует...

Понимаешь, у нас, на русском языке имеются всего две книги:

Рубен Ахаян "Macromedia ColdFusion. Наиболее полное руководство"

и

Роб Брукс-Билсон "Программирование на ColdFusion"

Все эти книги касаются только ColdFusion 5 версии... что сам понимаешь не есть хорошо.
И все. Больше на русском языке ты ничего не найдешь.
У меня парочка современных книг, переведенных в формат chm - если надо, могу заслать:
Одна называется "ADVANCED macromedia® COLDFUSION® MX 7 Application Development" объемом в 1000 страниц, а вторая называется "ColdFusion MX Bible" объемомом в 1250 страниц и в pdf.
Если надо - могу выслать тебе на мыло. Но учти, что весят они соответственно 18 и 9 метров. :)

Что касается хостеров, то известны мне только Арбатек и MTW

nirth комментирует...

спасибо тогда как из командировки вернусь, свяжусь с тобой еще разок, и попрошу послать книжки =)

injun #576871 комментирует...

ОК, пиши! :)

kEy комментирует...

Код работает только с CF7 и выше.

injun #576871 комментирует...

Да, верно. Код работает только в coldfusion mx7. Я просто забыл об этом упомянуть, ибо сейчас работаю только на cfmx7 и иногда забываю, что множество, если не большинство, сидит на cfmx6. :) Моя ошибка... :)

Dmitry Yakhnov комментирует...

У меня дома тоже CFMX7, а на работе только CFMX6, но лицензионный :)

injun #576871 комментирует...

У меня на работе стоит уже cfmx7 enterprise лицензионный,
дома стоят и семерка и шестерка... правда develeopers edition... :)