[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Замена цвета в изображении
Shurick
Доброго времени суток!

Если кто знает - прошу помощи! Есть логотип, допусти, два цвета - синий, красный. Как заменить заданный цвет в изображении, и возможно ли это сделать посредством PHP?




Спустя 37 минут, 37 секунд (14.07.2012 - 00:05) kamanch написал(а):
Как-то так:
imagecolorat
imagesetpixel

Ну и для детального оттачивания: GD и функции для работы с изображениями Функции

Спустя 52 минуты (14.07.2012 - 00:57) kamanch написал(а):
О, даж накида пару строк :)

$img_size=getimagesize('test.png');

$img=imagecreatefrompng('test.png');
$green = imagecolorallocate($img, 0, 255, 0);

for($i = 0; $i <= $img_size[0]; $i++){
for($j = 0; $j <= $img_size[1]; $j++){
//echo imagecolorat($img, $i, $j)."<br />";
if(imagecolorat($img, $i, $j) == 177){
imagesetpixel($img, $i, $j, $green);
}
}
}


header("Content-type: image/png");
imagepng($img);

imagedestroy($img);


Исходная картинка:
user posted image

После обработки скриптом:
user posted image

Спустя 55 минут, 12 секунд (14.07.2012 - 01:52) Shurick написал(а):
работает, но только на краях остаются погрешности.

Спустя 30 минут, 29 секунд (14.07.2012 - 02:23) kamanch написал(а):
Значит не 2 цвета у тебя, а больше. Синих много разных бывает.
Я не спроста оставил закоментированым строку
//echo imagecolorat($img, $i, $j)."<br />";


Раскоментируй, а вывод изображения убери. Станет всё ясно.

Спустя 8 часов, 33 минуты, 22 секунды (14.07.2012 - 10:56) Shurick написал(а):
провери вот этим кодом

<?php
function
colorPalette($imageFile, $numColors, $granularity = 5)
{
$granularity = max(1, abs((int)$granularity));
$colors = array();
$size = @getimagesize($imageFile);
if($size === false)
{
user_error("Unable to get image size data");
return false;
}
$img = @imagecreatefrompng($imageFile);
if(!$img)
{
user_error("Unable to open image file");
return false;
}
for($x = 0; $x < $size[0]; $x += $granularity)
{
for($y = 0; $y < $size[1]; $y += $granularity)
{
$thisColor = imagecolorat($img, $x, $y);
$rgb = imagecolorsforindex($img, $thisColor);
$red = round(round(($rgb['red'] / 0x33)) * 0x33);
$green = round(round(($rgb['green'] / 0x33)) * 0x33);
$blue = round(round(($rgb['blue'] / 0x33)) * 0x33);
$thisRGB = sprintf('%02X%02X%02X', $red, $green, $blue);
if(array_key_exists($thisRGB, $colors))
{
$colors[$thisRGB]++;
}
else
{
$colors[$thisRGB] = 1;
}
}
}

arsort($colors);
return array_slice(array_keys($colors), 0, $numColors);
}
?>
<div align="center"><img src="test.png" alt="test.jpg"/><br/><br/></div>
<?php
// пример использования:
$palette = colorPalette('test.png', 10, 5);
echo "<table align='center'>\n";
foreach($palette as $color)
{
echo "<tr><td style='background-color:#$color;width:2em;'> </td><td>#$color</td></tr>\n";
}
echo "</table>\n";


выводит два цвета. а замена почему то получается корявая


 ! 

М
оформляйте код тегами!
killer8080

Спустя 3 часа, 45 минут, 42 секунды (14.07.2012 - 14:42) walerus написал(а):
Можно попробовать добавить погрешность цвета, например если цвет в пределах допустим от 200 и выше, то менять на одно, если меньше то менять на другое, вроде как с ЧБ фото, только соответственно использовать нужные Вам цвета...

Спустя 21 минута, 12 секунд (14.07.2012 - 15:03) Shurick написал(а):
Возможно есть вариант полной заливки палитры цвета?

Спустя 1 час, 41 минута, 7 секунд (14.07.2012 - 16:44) kamanch написал(а):
Ты изображение прицепи. А то трудно думать, мож у тебя там вообще 65k палитра.

Спустя 47 минут, 43 секунды (14.07.2012 - 17:32) Shurick написал(а):
изображение просто создаю в фотошопе, фигура png

можно ли как то воспользоваться для этих целей imagecolorset() ?

Спустя 15 минут, 8 секунд (14.07.2012 - 17:47) Shurick написал(а):
вот попробуй подобное изображение, к примеру красный заменить на зеленый, по контуру остаются баги

user posted image

Спустя 20 минут, 43 секунды (14.07.2012 - 18:08) Shurick написал(а):
imagecolorset() почему то работает только с GIF

Спустя 42 минуты, 2 секунды (14.07.2012 - 18:50) kamanch написал(а):
Да нормально он с png работает.
А огрехи по краям потому, что по краям не тот красный, который в центре.
И картинка у тебя не из 2х цветов состоит.
У компа глаз нет, он не видит цвета. Для него ff0000 и fd0000 - это абсолютно разные цвета, и пофиг что это оба красные.

Вот твоя палитра:
Свернутый текст
Array
(
[0] => 2130706432
[1] =>
[2] => 1493106688
[3] => 1895759872
[4] => 285081600
[5] => 553517056
[6] => 1358888960
[7] => 16711680
[8] => 1224671232
[9] => 150929408
[10] => 1761542144
[11] => 419364864
[12] => 1090453504
[13] => 687800320
[14] => 2029977600
[15] => 956235776
[16] => 1627324416
[17] => 822018048
[18] => 1879048192
[19] => 2013265920
[20] => 1342177280
[21] => 1073741824
[22] => 1476395008
[23] => 1610612736
[24] => 134217728
[25] => 536870912
[26] => 1744830464
[27] => 402653184
[28] => 939524096
[29] => 1207959552
[30] => 671088640
[31] => 268435456
[32] => 805306368
)


Дальше вылавливай все оттенки краного и заменяй их на свой цвет.

По-поводу фотошопа.
Я верю, что ты там создал файл с 2мя цветами, сохранил как для Веб в png, что бы все красиво выглядело.
Но не 2 там цвета.
Обрабатывать изображения на php - это примерно так же, как и писать скрипты на Photoshop
Сапожник, как говориться, должен шить сапоги.
Подумай, может твоя задача может быть решена другим спозобом, кроме как прогонять картинку через скрипт.

На худой конец выкладывай задачу, вместе подумаем.

Спустя 18 часов, 10 минут, 15 секунд (15.07.2012 - 13:00) killer8080 написал(а):
<?php 

$pic = 'http://www.supermaika.ru/pics/png/a2a4f38e352973aa45f949c57a62993f.png';
$img_size = getimagesize($pic);

$img = imagecreatefrompng($pic);

imagesavealpha($img, true);

$green = imagecolorallocate($img, 0, 255, 0);

for($i = 0; $i < $img_size[0]; $i++){
for($j = 0; $j < $img_size[1]; $j++){
$color = imagecolorsforindex($img, imagecolorat($img, $i, $j) );
if($color['red'] > 200 && $color['green'] < 50 && $color['blue'] < 50){
imagesetpixel($img, $i, $j, $green);
}
}
}



imagepng($img, 'test.png');

imagedestroy($img);

?>
<img src="test.png?<?=time()?>" />

Спустя 5 часов, 58 минут, 5 секунд (15.07.2012 - 18:58) kamanch написал(а):
killer8080
Работает, но результат не очень, т.к. в исходной картинке размытости, а в полученной их нет, и имеем рубленные края.
Думаю, копать нужно в сторону сдвига палитры.

Спустя 46 минут, 45 секунд (15.07.2012 - 19:45) killer8080 написал(а):
Цитата (h.n.81 @ 15.07.2012 - 18:58)
killer8080
Работает, но результат не очень, т.к. в исходной картинке размытости, а в полученной их нет, и имеем рубленные края.
Думаю, копать нужно в сторону сдвига палитры.

Просто в исходной палитре задействован альфа канал. Вот ещё вариант
<?php 

$pic = 'http://www.supermaika.ru/pics/png/a2a4f38e352973aa45f949c57a62993f.png';
$img_size = getimagesize($pic);

$img = imagecreatefrompng($pic);

imagesavealpha($img, true);

for($i = 0; $i < $img_size[0]; $i++){
for($j = 0; $j < $img_size[1]; $j++){
$color = imagecolorsforindex($img, imagecolorat($img, $i, $j) );
if($color['red'] > 200 && $color['green'] < 50 && $color['blue'] < 50){
$new_color = imagecolorallocatealpha ($img, $color['green'], $color['red'], $color['blue'], $color['alpha']);
imagesetpixel($img, $i, $j, $new_color);
}
}
}



imagepng($img, 'test.png', 9);

imagedestroy($img);

?>
<img src="test.png?<?=time()?>" />

Спустя 24 минуты, 47 секунд (15.07.2012 - 20:10) kamanch написал(а):
killer8080
Еще хуже получилось.

Я бы собственную функцию написал по следующему принципу:
Если разложить красные оттенки, то имеем (от темного к светлому):

R G B
255 0 0
255 48 48
255 113 133
255 192 192

Меняем красный на зеленый:

R G B
0 255 0
48 255 48
113 255 113
192 255 192


С другими цветами немного сложнее будет, но принцип тот же: имеем размытость цвета 4мя оттенками, с ними и работаем

Спустя 9 минут, 53 секунды (15.07.2012 - 20:20) killer8080 написал(а):
Цитата (h.n.81 @ 15.07.2012 - 20:10)
Я бы собственную функцию написал по следующему принципу:
Если разложить красные оттенки, то имеем (от темного к светлому):

R GB
25500
25548 48
255 113 133
255 192 192

Меняем красный на зеленый:

R GB
0255 0
4825548
113 255 113
192 255 192

Ну у меня принцип практически тот же в последнем примере, плюс учитывается альфа канал. Возможно это из-за того ,что на зеленом границы контрастней выглядят визуально unsure.gif


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.