четверг, 5 февраля 2009 г.

Черно-белое фото с помощью PHP

Marilyn MonroeМногим людям нравится черно-белое фото. Такое фото создает некий эффект «классики», «старомодности», зрелости. Vintage -- одним словом. Вы не знали? -- «раньше небо было голубее, солнце желтее...»*, а PHP и в помине не было.

*Это прекрасно видно на черно-белых снимках ;)
И тем не менее пример из недавней практики -- как сделать цветное изображение черно-белым на PHP с помощью библиотеки GD.
function grayscale($filename){
//Получаем размеры изображения
$img_size = GetImageSize($filename);
$width = $img_size[0];
$height = $img_size[1];
//Создаем новое изображение с такмими же размерами
$img = imageCreate($width,$height);
//Задаем новому изображению палитру "оттенки серого" (grayscale)
for ($c = 0; $c < 256; $c++) {
ImageColorAllocate($img, $c,$c,$c);
}
//Содаем изображение из файла Jpeg
$img2 = ImageCreateFromJpeg($filename);
//Объединяем два изображения
ImageCopyMerge($img,$img2,0,0,0,0, $width, $height, 100);
//Сохраняем полученное изображение
imagejpeg($img, $filename);
//Освобождаем память, занятую изображением
imagedestroy($img);
}

Этот метод сохраняет изображения в черно-белой гамме. Например, при загрузке файлов на сервер.

Если же, к примеру, у вас на сервере хранятся цветные изображения, а вам по некоторым причинам решительно захотелось «отдать» их браузеру как черно-белые. Воспользуйтесь следующей модификацией этого метода:

function show_grayscale($filename){
$img_size = GetImageSize($filename);
$width = $img_size[0];
$height = $img_size[1];
$img = imageCreate($width,$height);
for ($c = 0; $c < 256; $c++) {
ImageColorAllocate($img, $c,$c,$c);
}
$img2 = ImageCreateFromJpeg($filename);
ImageCopyMerge($img,$img2,0,0,0,0, $width, $height, 100);
//Отдаем полученное изображение браузеру
header("Content-type: image/jpeg");
imagejpeg($img);

imagedestroy($img);
}

Pro et Contra

..или «За и Против» обоих методов.
В первом примере:
  • (+) ваше приложение нагружается всего один раз -- когда вы сохраняете изображение;
  • (-) на сервере у вас хранятся черно-белые изображения. Цветных вы из них уже не сделаете.

Во втором примере:
  • (+) на сервере у вас хранятся цветные изображения. И вы всегда можете выбрать как их отобразить;
  • (-) ваше приложение нагружается каждый раз -- когда вы отдаете черно-белое изображение браузеру.

4 Комментариев :

Анонимный комментирует...

Отличный код. А на счет плюсов и минусов, лучше пользоваться первым методом, просто делать копию изображения и ее делать черно-белой, а оригинал останется цветным

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

Спасибо. Как всегда, оптимальный вариант находится где-то между.
Оставлять оригинал – вообще полезная практика. Мы в одном рельсовом проекте нарезали из пользовательских изображений порядка 3-х видов тумбнайлзов с помощью file_column и ImageMagick. Оригинал при этом сохранялся, что прямо-таки спасло. Ибо размеры изображений с тех пор изменялись еще раза три.

Анонимный комментирует...

Помогите плиз. У меня почему то идет расспечатка рисунка в символах и ошибка в этой строке header("Content-type: image/jpeg"); что делать ? gd2 подключен

GD Support enabled
GD Version bundled (2.0.34 compatible)
FreeType Support enabled
FreeType Linkage with freetype
FreeType Version 2.1.9
T1Lib Support enabled
GIF Read Support enabled
GIF Create Support enabled
JPG Support enabled
PNG Support enabled
WBMP Support enabled
XBM Support enabled

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

Ошибка в строке header("Content-type: image/jpeg"); скорей всего указывает на то, что какие-то данные уже были отправлены на вывод браузеру.

Результат функции должен выводиться как изображение и никаких других данных не выдавать.
/* Самому бы не запутаться :) */
<img src="show.php?id=14" />
show.php – это файл скрипта, «одающий» картинку.

Отправить комментарий

Жги!