Конвертация изображения из цветного в черно-белый

Olsufr

Guest
Конвертация изображения из цветного в черно-белый

Подскажите, есть ли в PHP функции для конвертации изображения из цветного формата в черно-белый?
Здесь искал http://www.php.net/manual/en/ref.image.php ,
не нашел.
 

Olsufr

Guest
Понимаю, что вопрос мой не из оригинальных,
поэтому в поиске был в первую очередь,
но не нашел.
 

Гравицапа

elbirret elcno
http://ru.php.net/manual/en/function.imagecolorsforindex.php
PHP:
function imagegreyscale(&$img, $dither=1) {   
   if (!($t = imagecolorstotal($img))) {
       $t = 256;
       imagetruecolortopalette($img, $dither, $t);   
   }
   for ($c = 0; $c < $t; $c++) {   
       $col = imagecolorsforindex($img, $c);
       $min = min($col['red'],$col['green'],$col['blue']);
       $max = max($col['red'],$col['green'],$col['blue']);
       $i = ($max+$min)/2;
       imagecolorset($img, $c, $i, $i, $i);
   }
}
 

Olsufr

Guest
PHP:
function imageToGrayScale(&$image)
{
// Convert image in memory to grayscale
   $width  = imagesx($image);
   $height = imagesy($image);

   // convert to grayscale
   // note: this will NOT affect your original image, unless
   // originalFileName and destinationFileName are the same
   for ($y = 0; $y < $height; $y++) {
       for ($x = 0; $x < $width; $x++) {
           $rgb = imagecolorat($image, $x, $y);
           $red  = ($rgb >> 16) & 0xFF;
           $green = ($rgb >> 8)  & 0xFF;
           $blue  = $rgb & 0xFF;

           $gray = round(.299*$red + .587*$green + .114*$blue);
          
           // shift gray level to the left
           $grayR = $gray << 16;  // R: red
           $grayG = $gray << 8;    // G: green
           $grayB = $gray;        // B: blue
          
           // OR operation to compute gray value
           $grayColor = $grayR | $grayG | $grayB;

           // set the pixel color
           imagesetpixel($image, $x, $y, $grayColor);
           imagecolorallocate($image, $gray, $gray, $gray);
       }
   }
}
основа взята отсюда:
http://www.php.net/manual/en/function.imagecolorat.php
 

SiMM

Новичок
Olsufr, лажа :) Сложность алгоритма O(x*y). При изменении цветов палитры - O(c), где c (количество используемых в изображении цветов) <= x*y. Одно дело пересчитать 256 цветов палитры, и другое - перебрать для той же операции 1024x768 точек.
 

Olsufr

Guest
SiMM,
Сложность алгоритма O(x*y)
Да. Только вот ...

этот алгоритм работает для GIF:
PHP:
function Color2GrayScale(&$img){ // by SiMM
  for ($i = imagecolorstotal($img) ; $i-- ; ) {
    $c = imagecolorsforindex($img,$i);
    $c = 0.30*$c['red'] + 0.59*$c['green'] + 0.11*$c['blue'];
    imagecolorset($img,$i,$c,$c,$c);
  }
}
Color2GrayScale($img = imagecreatefromgif('http://www.aleksey.com/xmlsec/images/bart.gif')) ;
header("Content-type: image/gif");
imagegif($img);
а этот для JPEG:
PHP:
function imageToGrayScale(&$image)
{
// Convert image in memory to grayscale
   $width  = imagesx($image);
   $height = imagesy($image);

   // convert to grayscale
   // note: this will NOT affect your original image, unless
   // originalFileName and destinationFileName are the same
   for ($y = 0; $y < $height; $y++) {
       for ($x = 0; $x < $width; $x++) {
           $rgb = imagecolorat($image, $x, $y);
           $red  = ($rgb >> 16) & 0xFF;
           $green = ($rgb >> 8)  & 0xFF;
           $blue  = $rgb & 0xFF;

           $gray = round(.299*$red + .587*$green + .114*$blue);
          
           // shift gray level to the left
           $grayR = $gray << 16;  // R: red
           $grayG = $gray << 8;    // G: green
           $grayB = $gray;        // B: blue
          
           // OR operation to compute gray value
           $grayColor = $grayR | $grayG | $grayB;

           // set the pixel color
           imagesetpixel($image, $x, $y, $grayColor);
           imagecolorallocate($image, $gray, $gray, $gray);
       }
   }
}
Первый из перечисленных алгоритмов для JPEG не прошел, а второй из GIFa сделал что-то непотребное.


Изображения в формате PNG после 1-ой и 2-ой обработки остаются такими же цветными как и раньше.

Так что, ищется что-то более универсальное и работающее под PHP4.
 

Olsufr

Guest
Оригинал в формате GIF:


после функции ot SIMM все ок


после функции
PHP:
function imageToGrayScale(&$image)
{ ... }
имеем:


после функции:
PHP:
function toGrayScale(&$img){
    imagecopymergegray($img, $img, 0, 0, 0, 0, imagesx($img), imagesy($img), 0);
}
имеем нечто фиолетово-черное:


================================================
Далее...

Функция
PHP:
function toGrayScale(&$img){
    imagecopymergegray($img, $img, 0, 0, 0, 0, imagesx($img), imagesy($img), 0);
}
на изображение в формате JPEG, PNG у меня никак не повлияла на цветность, а в случае GIF очень темное черно-фиолетовое изображение (фото см. выше).

-~{}~ 26.05.06 17:02:

SiMM, по формуле $c = 0.30*$c['red'] + 0.59*$c['green'] + 0.11*$c['blue'] изображение получается чуть более темное когда на изображении чистые цвета (красный, желтый, ..), чем то, которое получал с помощью фотошопа (стандартное переключение режима в greyscale, и только). Когда изображение не такое мультяшно-рисованное, т.е. как фотография, то черно-белое изображение нормально получается.
 

SiMM

Новичок
> после функции ot SIMM все ок
Я вообще-то имел ввиду картинки, которые той функцией обрабатываются неправильно :)
> Первый из перечисленных алгоритмов для JPEG не прошел
> Изображения в формате PNG после 1-ой и 2-ой обработки остаются такими же цветными как и раньше.
Остальные функции меня малоинтересуют - в FAQ должен лежать рабочий для всех случаев жизни пример :)

> по формуле $c = 0.30*$c['red'] + 0.59*$c['green'] + 0.11*$c['blue'] изображение получается чуть более темное
Возможно. Но что делает фотошоп - я не знаю, а во-вторых - формула не придумана мной - она пришла из телевидения (правда выше в коде была более точная формула).
 

Olsufr

Guest
Я вообще-то имел ввиду картинки, которые той функцией обрабатываются неправильно
Цветность картинок в форматах JPEG и PNG не меняется совсем. На первый взгляд, в них нет ничего неправильного :) , если не принимкать во внимание того факта, что они не черно-белые.




Результат с GIF (черно-белый, как и должно быть):


(оригинал был дан выше)

Код (для ясности, о чем идет речь):
PHP:
function gif2GrayScale(&$img){
  for ($i = imagecolorstotal($img) ; $i-- ; ) {
    $c = imagecolorsforindex($img,$i);
    $c = 0.30*$c['red'] + 0.59*$c['green'] + 0.11*$c['blue'];
    imagecolorset($img,$i,$c,$c,$c);
  }
}
 

SiMM

Новичок
> Код (для ясности, о чем идет речь):
В FAQ лежит другой код. Я помню, что у меня была такая проблема, но благодаря Гравицапе я её уже давно решил ;) (может и не корректно - но... пока есть то, что есть).
PS: и всё же не gif2GrayScale. Формат картинки, передаваемой в качестве аргумента, далеко не gif ;)
 

BlacKing

Новичок
Для всего чьл связано с картинками я использовал ImageMagic...PhotoShop в консоли это весч
 

Olsufr

Guest
Ok. :)
Это изменило цветность картинки в формате GIF и JPEG, но не PNG (осталась такой же цветной как и раньше).
 
Сверху