Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

GD инвертировать цвет?

714
08 декабря 2008 года
clgs
226 / / 29.10.2008
Не хотельсь бы писать быдло код.
С помошью int imagecolorat(resource im, int x, int y) узнаю цвет заданного пикселя, а с помошью чего его можно инвертировать?

PS как понял спечиальной функции нет. еще вопрос, трабла небольшая использую функциюimageTtfText, она как я понял не накладывает свершу, а сливает цвета. как решить?

посмотреть некоректную работу можно тут (меню)
714
08 декабря 2008 года
clgs
226 / / 29.10.2008
инвертировал так
$rgb=imagecolorsforindex($im, imagecolorat($im, $x, $y));
$color = imageColorAllocate($im, 255-$rgb['red'], 255-$rgb['green'], 255-$rgb['blue']);
но все равно функция imageTtfText касячит, да и как-то цвета плохо накладываются

PS решил поправить быдло код, написал
Код:
$rgb=imagecolorsforindex($im, imagecolorat($im, $x, $y));

function rgb2hsv($rgb, $q=0) {
    $rgb['red'] = 255-$rgb['red']+$q;
    $rgb['green'] = 255-$rgb['green']+$q;
    $rgb['blue'] = 255-$rgb['blue']+$q;
    if($rgb['red']<0) $rgb['red']=0;
    if($rgb['green']<0) $rgb['green']=0;
    if($rgb['blue']<0) $rgb['blue']=0;
    return $rgb;
}
$rgb=rgb2hsv($rgb,-80);
$color = imageColorAllocate($im, $rgb['red'], $rgb['green'], $rgb['blue']);
24K
08 декабря 2008 года
ostgals
53 / / 27.08.2007
Если нужен универсальный код, то:

 
Код:
$color = imagecolorsforindex($image, imagecolorat($image, $x, $y));

$color['red'] = ~$color['red'];
$color['green'] = ~$color['green'];
$color['blue'] = ~$color['blue'];

$inverted_color = imagecolorallocate($image, $color['red'], $color['green'], $color['blue']);


Если у тебя используется 24-битный цвет, то задача упрощается в разы:

(с учетом альфа канала)
 
Код:
$inverted_color = ($color & 0xFF000000) | (~$color & 0x00FFFFFF);

(без учета альфа-канала)
 
Код:
$inverted_color = ~$color;
714
08 декабря 2008 года
clgs
226 / / 29.10.2008
Цитата: ostgals
Если нужен универсальный код, то:

 
Код:
$color = imagecolorsforindex($image, imagecolorat($image, $x, $y));

$color['red'] = ~$color['red'];
$color['green'] = ~$color['green'];
$color['blue'] = ~$color['blue'];

$inverted_color = imagecolorallocate($image, $color['red'], $color['green'], $color['blue']);


Может я что-то не понимаю, но в данно примере цвет задается в диапазоне 0-255, то тогда при использовании оператора ~ получается отрицательно число -1 (т.е. -121 = ~120 не катит), мой вариант лучше. ИМХО

714
09 декабря 2008 года
clgs
226 / / 29.10.2008
Столкнулся с такой проблемкой, при размере файла PNG 5,13Кб и более переменная $colort наследует значение переменной $color, при размере 5,11Кб и менее работает на ура. Как обойти данную проблему, не прибегая к настройкам сервака?
Код:
# подключаем файл
$im = imageCreateFromPng("pic/$that.png");
...
# получаем цвет
$color=imageColorAllocate($im, 255, 255, 0);
$colort=imageColorAllocate($im, 13, 62, 0);
...
# рисуем
imageTtfText($im, $size, $angle, $x, $y+6+$angle, $colort, $font, $string);
imageTtfText($im, $size, $angle, $x, $y*3+6+$angle, $color, $font, $string);
...
24K
09 декабря 2008 года
ostgals
53 / / 27.08.2007
Цитата: clgs
Может я что-то не понимаю, но в данно примере цвет задается в диапазоне 0-255, то тогда при использовании оператора ~ получается отрицательно число -1 (т.е. -121 = ~120 не катит), мой вариант лучше. ИМХО



Оператор ~ - это не арифметический оператор, а побитовый (bitwise).
Для примера:

 
Код:
$a = 0xFF00FF00;
$b = ~$a; // 0x00FF00FF;


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

Вот более правильный вариант:

 
Код:
$color = imagecolorsforindex($image, imagecolorat($image, $x, $y));

$color['red'] = ~$color['red'] & 0xFF;
$color['green'] = ~$color['green'] & 0xFF;
$color['blue'] = ~$color['blue'] & 0xFF;

$inverted_color = imagecolorallocate($image, $color['red'], $color['green'], $color['blue']);
24K
09 декабря 2008 года
ostgals
53 / / 27.08.2007
Цитата: clgs
Столкнулся с такой проблемкой, при размере файла PNG 5,13Кб и более переменная $colort наследует значение переменной $color, при размере 5,11Кб и менее работает на ура. Как обойти данную проблему, не прибегая к настройкам сервака?



Может PNG не 24-битный?

Вообще думаю, что надо создавать новый образ в памяти с 24-битным цветом (imagecreatetruecolor), а потом уже рисовать на нем и рисунок из PNG файла (imagecopy), и текст (imagettftext).
И после этого отдавать его браузеру в любом формате... Хоть JPEG (imagejpeg), хоть PNG (imagepng).

714
09 декабря 2008 года
clgs
226 / / 29.10.2008
Создал 16 битный - то же самое, 24 не могу, нет такого варианта, 32 не поддерживает прозрачность.[COLOR="Gray"] (PhotoShop CS3)[/COLOR]

P.S. результат последнего тестирования показал: если за сесию выполнять одну операцию, то всё прекрасно работает.

Привожу код, да просто так)
Код:
<?php
$that=($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING']:$that;

$arr=array(
    "button0"=>"&#195;&#235;&#224;&#226;&#237;&#224;&#255;",
    "button1"=>"&#205;&#238;&#226;&#238;&#241;&#242;&#232;",
    "button2"=>".sdf..",
    "button3"=>"..ewr.",
    "button4"=>".sfsf..",
    "button5"=>".sdfsfd..",
    "button6"=>"&#206;&#225;&#240;&#224;&#242;&#237;&#224;&#255; &#241;&#226;&#255;&#231;&#252;"
);

// $src - &#232;&#241;&#245;&#238;&#228;&#237;&#251;&#233; &#244;&#224;&#233;&#235;
// $end - &#232;&#241;&#245;&#238;&#228;&#237;&#251;&#233; &#244;&#224;&#233;&#235;
// $text - &#242;&#229;&#234;&#241;&#242; &#234;&#238;&#242;&#240;&#251;&#233; &#237;&#243;&#230;&#237;&#238; &#237;&#224;&#240;&#232;&#241;&#238;&#226;&#224;&#242;&#252;
// $color - &#204;&#224;&#241;&#241;&#232;&#226; &#246;&#226;&#229;&#242;&#238;&#226; &#242;&#229;&#234;&#241;&#242;&#224; array('red','green','blue') &#238;&#242; 0 &#228;&#238; 255
// $SX- &#241;&#236;&#229;&#249;&#229;&#237;&#232;&#229; &#238;&#242;&#237;&#238;&#241;&#232;&#242;&#229;&#235;&#252;&#237;&#238; &#227;&#238;&#240;&#232;&#231;&#238;&#237;&#242;&#224;&#235;&#232;
// $SY - &#241;&#236;&#229;&#249;&#229;&#237;&#232;&#229; &#238;&#242;&#237;&#238;&#241;&#232;&#242;&#229;&#235;&#252;&#237;&#238; &#226;&#229;&#240;&#242;&#232;&#234;&#224;&#235;&#232;
// $PX- &#237;&#224;&#247;&#224;&#235;&#252;&#237;&#224;&#255; &#239;&#238;&#231;&#232;&#246;&#232;&#255; &#238;&#242;&#237;&#238;&#241;&#232;&#242;&#229;&#235;&#252;&#237;&#238; &#227;&#238;&#240;&#232;&#231;&#238;&#237;&#242;&#224;&#235;&#232;
// $PY - &#237;&#224;&#247;&#224;&#235;&#252;&#237;&#224;&#255; &#239;&#238;&#231;&#232;&#246;&#232;&#255; &#238;&#242;&#237;&#238;&#241;&#232;&#242;&#229;&#235;&#252;&#237;&#238; &#226;&#229;&#240;&#242;&#232;&#234;&#224;&#235;&#232;
// $angle - &#211;&#227;&#238;&#235; &#239;&#238;&#226;&#238;&#240;&#238;&#242;&#224; &#231;&#224;&#226;&#232;&#241;&#232;&#242; &#238;&#242; &#242;&#229;&#234;&#243;&#249;&#229;&#227;&#238; &#226;&#240;&#229;&#236;&#229;&#237;&#232;.
// $size - &#208;&#224;&#231;&#236;&#229;&#240; &#248;&#240;&#232;&#244;&#242;&#224;
function _ImgCreate($src="blank",$end=FALSE,$text,$color,$SX=0,$SY=0,$PX=0,$PY=0,$angle=0,$size=0) {
    // &#207;&#238;&#228;&#227;&#240;&#243;&#230;&#224;&#229;&#236; &#225;&#232;&#225;&#235;&#232;&#238;&#242;&#229;&#234;&#232;
    require_once ("lib/imagettf.php");
    require_once ("lib/image.php");

    // &#194;&#251;&#226;&#238;&#228;&#232;&#236;&#224;&#255; &#241;&#242;&#240;&#238;&#234;&#224;.
    // &#194;&#205;&#200;&#204;&#192;&#205;&#200;&#197;! &#196;&#235;&#255; &#238;&#242;&#238;&#225;&#240;&#224;&#230;&#229;&#237;&#232;&#255; &#240;&#243;&#241;&#241;&#234;&#232;&#245; &#225;&#243;&#234;&#226; &#237;&#229;&#238;&#225;&#245;&#238;&#228;&#232;&#236;&#238; &#232;&#245;
    // &#239;&#229;&#240;&#229;&#228;&#224;&#226;&#224;&#242;&#252; &#237;&#229; &#226; &#234;&#238;&#228;&#232;&#240;&#238;&#226;&#234;&#229; Windows, &#224; &#226; Unicode!
    $string = toUnicodeEntities($text); // &#204;&#238;&#230;&#237;&#238; &#231;&#224;&#236;&#229;&#237;&#232;&#242;&#252; &#241;&#226;&#238;&#232;&#236;

    // &#216;&#240;&#232;&#244;&#242;.
    $font = "ttf/TIMESBI.TTF";

    // &#199;&#224;&#227;&#240;&#243;&#230;&#224;&#229;&#236; &#244;&#238;&#237;&#238;&#226;&#238;&#233; &#240;&#232;&#241;&#243;&#237;&#238;&#234;.
    if(!$im=_ImCreate("pic/$src")) {
        // &#200;&#235;&#232; &#241;&#238;&#231;&#228;&#224;&#229;&#236; &#241;&#226;&#238;&#233;
        $im=ImageCreate(144, 62);
        $col=imageColorAllocate($im, 255, 255, 255);
    }

    // &#207;&#238;&#228;&#227;&#238;&#237;&#255;&#229;&#236; &#240;&#224;&#231;&#236;&#229;&#240; &#242;&#229;&#234;&#241;&#242;&#224; &#239;&#238;&#228; &#240;&#224;&#231;&#236;&#229;&#240; &#232;&#231;&#238;&#225;&#240;&#224;&#230;&#229;&#237;&#232;&#255;.
    if(!$size) { $size = @imageTtfGetMaxSize($angle, $font, $string, imageSX($im), imageSY($im))-2; if($size>14)$size=14; }

    if(is_array($color) && 0<=$color['red'] && $color['red']<=255 && 0<=$color['green'] && $color['green']<=255 && 0<=$color['blue'] && $color['blue']<=255) $col=imageColorAllocate($im, $color['red'], $color['green'], $color['blue']);
    else $col=imageColorAllocate($im, 0, 0, 0);

    // &#194;&#251;&#247;&#232;&#241;&#235;&#255;&#229;&#236; &#234;&#238;&#238;&#240;&#228;&#232;&#237;&#224;&#242;&#251; &#226;&#251;&#226;&#238;&#228;&#224;, &#247;&#242;&#238;&#225;&#251; &#242;&#229;&#234;&#241;&#242; &#238;&#234;&#224;&#231;&#224;&#235;&#241;&#255; &#226; &#246;&#229;&#237;&#242;&#240;&#229;.
    if(!$PY) $PY=imageSY($im)-$size; // &#232;&#249;&#232;&#236; &#246;&#229;&#237;&#242;&#240;

    imageTtfText($im, $size, $angle, $PX+$SX, $PY+$SY+$angle, $col, $font, $string);

    // &#209;&#238;&#238;&#225;&#249;&#224;&#229;&#236; &#238; &#242;&#238;&#236;, &#247;&#242;&#238; &#228;&#224;&#235;&#229;&#229; &#241;&#235;&#229;&#228;&#243;&#229;&#242; &#240;&#232;&#241;&#243;&#237;&#238;&#234; PNG.
    Header("Content-type: image/png");

    // &#194;&#251;&#226;&#238;&#228;&#232;&#236; &#240;&#232;&#241;&#243;&#237;&#238;&#234;
    if($end) imagepng($im,"$end",9,NULL);
    else imagePng($im);
    imagedestroy($im);
}

$q=md5($that.$arr[$that]);

//1
//_ImgCreate($that,'pic/_'.$q.'.png',$arr[$that],array("red"=>0,"green"=>0,"blue"=>0),2,6,10,16,0,0);
//2
//_ImgCreate('_'.$q,'pic/_'.$q.'.png',$arr[$that],array("red"=>0,"green"=>0,"blue"=>0),4,6,10,16,0,0);
//3
//_ImgCreate('_'.$q,'pic/_'.$q.'.png',$arr[$that],array("red"=>0,"green"=>0,"blue"=>0),3,5,10,16,0,0);
//4
//_ImgCreate('_'.$q,'pic/_'.$q.'.png',$arr[$that],array("red"=>0,"green"=>0,"blue"=>0),3,7,10,16,0,0);
//5
//_ImgCreate('_'.$q,'pic/_'.$q.'.png',$arr[$that],array("red"=>0,"green"=>0,"blue"=>0),3,37,10,16,0,0);
//6
_ImgCreate('_'.$q,'pic/_'.$q.'.png',$arr[$that],array("red"=>255,"green"=>255,"blue"=>0),3,6,10,16,0,0);
?>
24K
09 декабря 2008 года
ostgals
53 / / 27.08.2007
Хм.. Даже в Photoshop CS я могу сохранить PNG с 8 битами на канал (включая альфу).

Попробуйте использовать мой вариант с рисованием на 24-битной карте в памяти.
24K
09 декабря 2008 года
ostgals
53 / / 27.08.2007
Кстати, сейчас выглядит красиво :)

А, если не секрет, как темная кайма сделана вокруг желтых букав?
714
10 декабря 2008 года
clgs
226 / / 29.10.2008
если присмотрется на код, то станет понятно. не беде мучать =) просто там еще 4 надписи на черном, со смещением на 1px вверх вниз влево вправо)

Сейчас красиво, потому что кнопочки не генирируюся больше, они статичны)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог