GD - странность...

GrayMaster

Новичок
GD - странность...

такой вот простой код:
PHP:
$str = implode("", file("img.png"));

$im = ImageCreateFromString($str);

for ($x = 0; $x < imagesx($im); $x++) {
        for ($y = 0; $y < imagesy($im); $y++) {
                $rgb = imagecolorat($im, $x, $y);
                $r = ($rgb >> 16) & 0xFF;
                $g = ($rgb >> 8) & 0xFF;
                $b = $rgb & 0xFF;

                if ($r > 0 or $g > 0 or $b > 0) {
                        imagesetpixel($im, $x, $y, imagecolorallocate($im, 0, 0, 0));
                } else {
                        imagesetpixel($im, $x, $y, imagecolorallocate($im, 255, 255, 255));
                }
        }
}

header("Content-type: image/png");
imagepng($im);
Картинка 2-х цветная PNG, т.е. результат должен быть 2-х цветный (черный и белый)
Результат же получается - пол картинки фильтруется правильно (черный и белый), другая половина черная, когда картинка всего из 2-х цветов состоит...
 

white phoenix

Новичок
> $str = implode("", file("img.png"));
Это надо в Юмор. Про [m]file_get_contents[/m] слышал? Или [m]fread[/m] на худой конец, всё быстрее чем это нечто.
> imagesetpixel($im, $x, $y, imagecolorallocate($im, 0, 0, 0));
Запустил скрипт "как есть" и увидел ощутимые тормоза, за тебя пришлось вынести imagecolorallocate($im, 0, 0, 0) в $black, а imagecolorallocate($im, 255, 255, 255) в $white, ты подумай сколько раз создаются цвета (для каждого пикселя, т.е. imagesx($im)*imagesy($im) раз(а)). У меня на картинке было 136180.
> Картинка 2-х цветная PNG, т.е. результат должен быть 2-х
> цветный (черный и белый)Результат же получается - пол
> картинки фильтруется правильно (черный и белый), другая
> половина черная, когда картинка всего из 2-х цветов состоит...
Твой скрипт будет нечерные писели делать чёрными, а чёрные - белыми.
> if ($r > 0 or $g > 0 or $b > 0) {
Мне кажется у тебя с логикой серьезные проблемы. Это условие равносильно if ($rgb != 0x000000), т.к. ложь будет только в том случае если $r = $g = $b = 0x00 ($rgb = 0x000000). Значит словами: если писель не черный, то делаем его чёрным, а если он уже чёрный, то делаем белым.
> Результат же получается - пол картинки фильтруется
> правильно (черный и белый), другая половина черная, когда
> картинка всего из 2-х цветов состоит...
В крапинку? :D
> Картинка 2-х цветная PNG, т.е. результат должен быть 2-х цветный (черный и белый)
[telepate]
PHP:
$str = file_get_contents("img.png");
$im = ImageCreateFromString($str);
$black = imagecolorallocate($im,0,0,0);
$white = imagecolorallocate($im,255,255,255);
$sy = imagesy($im);
for ($x = 0; $x < imagesx($im); $x++)
{
 for ($y = 0; $y < $sy; $y++)
 {
  $rgb = imagecolorat($im, $x, $y);
  $r = ($rgb >> 16) & 0xFF;
  $g = ($rgb >> 8) & 0xFF;
  $b = $rgb & 0xFF;
  if ($r > 128 or $g > 128 or $b > 128) {imagesetpixel($im,$x,$y,$black);}
  else {imagesetpixel($im,$x,$y,$white);}
 }
}
header("Content-type: image/png");
imagepng($im);
[/telepate]
 

white phoenix

Новичок
SiMM
Не работает. На черном фоне несколько пикселей белых и всё, с параметрами играл долго. PHP 5.1.2.
 
Сверху