GD инвертировать цвет?
С помошью int imagecolorat(resource im, int x, int y) узнаю цвет заданного пикселя, а с помошью чего его можно инвертировать?
PS как понял спечиальной функции нет. еще вопрос, трабла небольшая использую функциюimageTtfText, она как я понял не накладывает свершу, а сливает цвета. как решить?
посмотреть некоректную работу можно тут (меню)
$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']);
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']);
Код:
$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']);
$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;
Цитата: 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']);
$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 не катит), мой вариант лучше. ИМХО
Код:
# подключаем файл
$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);
...
$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);
...
Цитата: clgs
Может я что-то не понимаю, но в данно примере цвет задается в диапазоне 0-255, то тогда при использовании оператора ~ получается отрицательно число -1 (т.е. -121 = ~120 не катит), мой вариант лучше. ИМХО
Оператор ~ - это не арифметический оператор, а побитовый (bitwise).
Для примера:
Код:
$a = 0xFF00FF00;
$b = ~$a; // 0x00FF00FF;
$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']);
$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']);
Цитата: clgs
Столкнулся с такой проблемкой, при размере файла PNG 5,13Кб и более переменная $colort наследует значение переменной $color, при размере 5,11Кб и менее работает на ура. Как обойти данную проблему, не прибегая к настройкам сервака?
Может PNG не 24-битный?
Вообще думаю, что надо создавать новый образ в памяти с 24-битным цветом (imagecreatetruecolor), а потом уже рисовать на нем и рисунок из PNG файла (imagecopy), и текст (imagettftext).
И после этого отдавать его браузеру в любом формате... Хоть JPEG (imagejpeg), хоть PNG (imagepng).
P.S. результат последнего тестирования показал: если за сесию выполнять одну операцию, то всё прекрасно работает.
Привожу код, да просто так)
Код:
<?php
$that=($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING']:$that;
$arr=array(
"button0"=>"Ãëàâíàÿ",
"button1"=>"Íîâîñòè",
"button2"=>".sdf..",
"button3"=>"..ewr.",
"button4"=>".sfsf..",
"button5"=>".sdfsfd..",
"button6"=>"Îáðàòíàÿ ñâÿçü"
);
// $src - èñõîäíûé ôàéë
// $end - èñõîäíûé ôàéë
// $text - òåêñò êîòðûé íóæíî íàðèñîâàòü
// $color - Ìàññèâ öâåòîâ òåêñòà array('red','green','blue') îò 0 äî 255
// $SX- ñìåùåíèå îòíîñèòåëüíî ãîðèçîíòàëè
// $SY - ñìåùåíèå îòíîñèòåëüíî âåðòèêàëè
// $PX- íà÷àëüíàÿ ïîçèöèÿ îòíîñèòåëüíî ãîðèçîíòàëè
// $PY - íà÷àëüíàÿ ïîçèöèÿ îòíîñèòåëüíî âåðòèêàëè
// $angle - Óãîë ïîâîðîòà çàâèñèò îò òåêóùåãî âðåìåíè.
// $size - Ðàçìåð øðèôòà
function _ImgCreate($src="blank",$end=FALSE,$text,$color,$SX=0,$SY=0,$PX=0,$PY=0,$angle=0,$size=0) {
// Ïîäãðóæàåì áèáëèîòåêè
require_once ("lib/imagettf.php");
require_once ("lib/image.php");
// Âûâîäèìàÿ ñòðîêà.
// ÂÍÈÌÀÍÈÅ! Äëÿ îòîáðàæåíèÿ ðóññêèõ áóêâ íåîáõîäèìî èõ
// ïåðåäàâàòü íå â êîäèðîâêå Windows, à â Unicode!
$string = toUnicodeEntities($text); // Ìîæíî çàìåíèòü ñâîèì
// Øðèôò.
$font = "ttf/TIMESBI.TTF";
// Çàãðóæàåì ôîíîâîé ðèñóíîê.
if(!$im=_ImCreate("pic/$src")) {
// Èëè ñîçäàåì ñâîé
$im=ImageCreate(144, 62);
$col=imageColorAllocate($im, 255, 255, 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);
// Âû÷èñëÿåì êîîðäèíàòû âûâîäà, ÷òîáû òåêñò îêàçàëñÿ â öåíòðå.
if(!$PY) $PY=imageSY($im)-$size; // èùèì öåíòð
imageTtfText($im, $size, $angle, $PX+$SX, $PY+$SY+$angle, $col, $font, $string);
// Ñîîáùàåì î òîì, ÷òî äàëåå ñëåäóåò ðèñóíîê PNG.
Header("Content-type: image/png");
// Âûâîäèì ðèñóíîê
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);
?>
$that=($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING']:$that;
$arr=array(
"button0"=>"Ãëàâíàÿ",
"button1"=>"Íîâîñòè",
"button2"=>".sdf..",
"button3"=>"..ewr.",
"button4"=>".sfsf..",
"button5"=>".sdfsfd..",
"button6"=>"Îáðàòíàÿ ñâÿçü"
);
// $src - èñõîäíûé ôàéë
// $end - èñõîäíûé ôàéë
// $text - òåêñò êîòðûé íóæíî íàðèñîâàòü
// $color - Ìàññèâ öâåòîâ òåêñòà array('red','green','blue') îò 0 äî 255
// $SX- ñìåùåíèå îòíîñèòåëüíî ãîðèçîíòàëè
// $SY - ñìåùåíèå îòíîñèòåëüíî âåðòèêàëè
// $PX- íà÷àëüíàÿ ïîçèöèÿ îòíîñèòåëüíî ãîðèçîíòàëè
// $PY - íà÷àëüíàÿ ïîçèöèÿ îòíîñèòåëüíî âåðòèêàëè
// $angle - Óãîë ïîâîðîòà çàâèñèò îò òåêóùåãî âðåìåíè.
// $size - Ðàçìåð øðèôòà
function _ImgCreate($src="blank",$end=FALSE,$text,$color,$SX=0,$SY=0,$PX=0,$PY=0,$angle=0,$size=0) {
// Ïîäãðóæàåì áèáëèîòåêè
require_once ("lib/imagettf.php");
require_once ("lib/image.php");
// Âûâîäèìàÿ ñòðîêà.
// ÂÍÈÌÀÍÈÅ! Äëÿ îòîáðàæåíèÿ ðóññêèõ áóêâ íåîáõîäèìî èõ
// ïåðåäàâàòü íå â êîäèðîâêå Windows, à â Unicode!
$string = toUnicodeEntities($text); // Ìîæíî çàìåíèòü ñâîèì
// Øðèôò.
$font = "ttf/TIMESBI.TTF";
// Çàãðóæàåì ôîíîâîé ðèñóíîê.
if(!$im=_ImCreate("pic/$src")) {
// Èëè ñîçäàåì ñâîé
$im=ImageCreate(144, 62);
$col=imageColorAllocate($im, 255, 255, 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);
// Âû÷èñëÿåì êîîðäèíàòû âûâîäà, ÷òîáû òåêñò îêàçàëñÿ â öåíòðå.
if(!$PY) $PY=imageSY($im)-$size; // èùèì öåíòð
imageTtfText($im, $size, $angle, $PX+$SX, $PY+$SY+$angle, $col, $font, $string);
// Ñîîáùàåì î òîì, ÷òî äàëåå ñëåäóåò ðèñóíîê PNG.
Header("Content-type: image/png");
// Âûâîäèì ðèñóíîê
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);
?>
Попробуйте использовать мой вариант с рисованием на 24-битной карте в памяти.
А, если не секрет, как темная кайма сделана вокруг желтых букав?
Сейчас красиво, потому что кнопочки не генирируюся больше, они статичны)