Конвертнуть изображение в черно-белое на php

dandandan

Мой дом здесь!
Регистрация
7 Авг 2008
Сообщения
1.036
Реакции
292
Стоит задача конвертировать изображение в черно-белое (можно с оттенками серого) стандартными средствами php.


Гугл помог. Как это сделать с помощью библиотеки gd - я нашел. Выкладываю, может кому пригодится.
PHP:
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);
}
Этот метод сохраняет изображения в черно-белой гамме. Например, при загрузке файлов на сервер.

Если же, к примеру, у вас на сервере хранятся цветные изображения, а вам по некоторым причинам решительно захотелось «отдать» их браузеру как черно-белые. Воспользуйтесь следующей модификацией этого метода:
PHP:
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);
}
 
  • Нравится
Реакции: Mons
Было бы не плохо для начинающих привести готовый пример.
Не все сразу могут догнать что $filename тот же самый еще нужно задать ))
 
есть мини фотошоп, для пхп
скласс в котором очень качественные наработки...
с классом идет масса примеров
 
  • Нравится
Реакции: zss
Спасибо. Единственное, не советую отдавать сразу в браузер, нагрузка при нескольких картинках получается не маленькая, лучше все таки продумать простенькое кеширование.
 
Если же, к примеру, у вас на сервере хранятся цветные изображения, а вам по некоторым причинам решительно захотелось «отдать» их браузеру как черно-белые. Воспользуйтесь следующей модификацией этого метода:
Для таких целей лучше JavaScript использовать.

Вот например дофига всяких эффектов можно наложить на стороне пользователя и не грузить сервак
 
PHP:
$im = imagecreatefrompng('test.png');
imagefilter($im, IMG_FILTER_GRAYSCALE);
так не пробовал?
 
Простенькая функция
PHP:
function Color2GrayScale(&$img, $dither = true)
{
  if (!($i = imagecolorstotal($img)))
    imagetruecolortopalette($img, $dither, $i = 256);
  while ($i--) {
    $c = imagecolorsforindex($img,$i);
    $c = 0.299*$c['red'] + 0.587*$c['green'] + 0.114*$c['blue'];
    imagecolorset($img,$i,$c,$c,$c);
  }
}
 
Простенькая функция
PHP:
function Color2GrayScale(&$img, $dither = true)
{
  if (!($i = imagecolorstotal($img)))
    imagetruecolortopalette($img, $dither, $i = 256);
  while ($i--) {
    $c = imagecolorsforindex($img,$i);
    $c = 0.299*$c['red'] + 0.587*$c['green'] + 0.114*$c['blue'];
    imagecolorset($img,$i,$c,$c,$c);
  }
}
зачем изобретать велосипед, если есть imagefilter?
 
Назад
Сверху