IMG_FILTER_NEGATE php4

Valenok

Новичок
IMG_FILTER_NEGATE php4

Помогите пожалуйста аналогом IMG_FILTER_NEGATE для php4
Долго ищю, никак не найду.







Нашёл код sepia effect но он не даёт нужного результата
PHP:
function pseudosepia(&$im,$percent){
	 $sx=imagesx($im);
     $sy=imagesy($im);
     $filter=imagecreatetruecolor($sx,$sy);
     $c=imagecolorallocate($filter,100,50,50);
     imagefilledrectangle($filter,0,0,$sx,$sy,$c);
     imagecopymerge($im,$filter,0,0,0,0,$sx,$sy,100);
	 return $filter;
}




Думал собрать в двумерный массив цвета каждого пикселя, и пропорционально менять белые оттенки на чёрныё, тоесть
PHP:
for ($i = 0; $i < $width; $i++)
    for ($j = 0; $j < $height; $j++)
        $pix[$i][$j] = 1777215 - (imagecolorat ($img, $i, $j));
Но после проверки, выходит что если собирать цвета всех пикселей после image_filter_nеgate на РНР 5, и если делать как я в коде выше, то массивы получаются разные.

Что я не пойму, так почему в моём методе в массиве получаются отрицательные значения цветов пикселей, когда максимальное значение цвета (белого) как раз 1777215 .

Буду рад помощи.
 

SiMM

Новичок
Индекс цвета пиксела и цвет пиксела - не одно и то же. Цвет пикселя по индексу можно узнать по [m]imagecolorsforindex[/m]
 

Valenok

Новичок
Тем не менее, пытался реализовать функцию IMG_FILTER_NEGATE
таким образом:, чтото не выходит..

PHP:
for ($i = 0; $i < $width; $i++)
    for ($j = 0; $j < $height; $j++){
        $col = 1777215 - (imagecolorat ($img, $i, $j));
            $the = imagecolorsforindex($img, $col);
            $color =  imagecolorallocate($img, $the['red'], $the['green'], $the['blue']); 
           imagesetpixel($img,$i,$j,$color);
    }
}
-~{}~ 28.05.07 12:57:

Помогите пожалуйста.

-~{}~ 28.05.07 13:36:

Нашёл такое:
Работает отменно, автору спасибо.

PHP:
<?php

$im = imagecreatefromjpeg("file.jpg");
$sz = getimagesize("file.jpg");
$new = imagecreatetruecolor($sz[0], $sz[1]);

$v = 0;
for ($i = 0; $i < $sz[0]; $i++) { // цикл для обхода строк
  for ($j = 0; $j < $sz[1]; $j++) { // цикл для обхода столбцов
    /* получим цвет точки $i, $j */
    $rgb = ImageColorAt($im, $i, $j);
    $r = 255 - (($rgb >> 16) & 0xFF);
    $g = 255 - (($rgb >> 8) & 0xFF);
    $b = 255 - ($rgb & 0xFF);
    $this[] = imagecolorallocate($new, $r, $g, $b);
    imagesetpixel($new, $i, $j, $this[$v]);
    $v++;
  }
}
// выведем картинку в браузер
header("Content-type: image/jpeg");
imagejpeg($new, null, 100);
// и освободим память
imagedestroy($im);
imagedestroy($new);
?>
Источник: Обращение цвета
Автор: Саня
 

SiMM

Новичок
> максимальное значение цвета (белого) как раз 1777215
Что-то я не глянул сразу в эту цифру. Максимальное значение белого - это 0xFFFFFF (0xFF для красного, зелёного и синего), соответственно, это 16777215, а не 1777215.

> $this[] = imagecolorallocate($new, $r, $g, $b);
> imagesetpixel($new, $i, $j, $this[$v]);
> $v++;
Подчёркнутое - совершенно бесполезно.
 

Valenok

Новичок
Насчёт бесполезности согласен, я привёл оригинал..

Странно, если я собираю в массив индекса цветов всех пикселей то у меня там есть, и не один раз, значения 1777215
 
Сверху