Если кто знает - прошу помощи! Есть логотип, допусти, два цвета - синий, красный. Как заменить заданный цвет в изображении, и возможно ли это сделать посредством PHP?
Спустя 37 минут, 37 секунд (14.07.2012 - 00:05) kamanch написал(а):
Как-то так:
imagecolorat
imagesetpixel
Ну и для детального оттачивания: GD и функции для работы с изображениями Функции
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);
Исходная картинка:

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

Спустя 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() ?
можно ли как то воспользоваться для этих целей imagecolorset() ?
Спустя 15 минут, 8 секунд (14.07.2012 - 17:47) Shurick написал(а):
вот попробуй подобное изображение, к примеру красный заменить на зеленый, по контуру остаются баги

Спустя 20 минут, 43 секунды (14.07.2012 - 18:08) Shurick написал(а):
imagecolorset() почему то работает только с GIF
Спустя 42 минуты, 2 секунды (14.07.2012 - 18:50) kamanch написал(а):
Да нормально он с png работает.
А огрехи по краям потому, что по краям не тот красный, который в центре.
И картинка у тебя не из 2х цветов состоит.
У компа глаз нет, он не видит цвета. Для него ff0000 и fd0000 - это абсолютно разные цвета, и пофиг что это оба красные.
Вот твоя палитра:
Дальше вылавливай все оттенки краного и заменяй их на свой цвет.
По-поводу фотошопа.
Я верю, что ты там создал файл с 2мя цветами, сохранил как для Веб в png, что бы все красиво выглядело.
Но не 2 там цвета.
Обрабатывать изображения на php - это примерно так же, как и писать скрипты на Photoshop
Сапожник, как говориться, должен шить сапоги.
Подумай, может твоя задача может быть решена другим спозобом, кроме как прогонять картинку через скрипт.
На худой конец выкладывай задачу, вместе подумаем.
А огрехи по краям потому, что по краям не тот красный, который в центре.
И картинка у тебя не из 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
)
(
[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
Еще хуже получилось.
Я бы собственную функцию написал по следующему принципу:
Если разложить красные оттенки, то имеем (от темного к светлому):
Меняем красный на зеленый:
С другими цветами немного сложнее будет, но принцип тот же: имеем размытость цвета 4мя оттенками, с ними и работаем
Еще хуже получилось.
Я бы собственную функцию написал по следующему принципу:
Если разложить красные оттенки, то имеем (от темного к светлому):
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 |
Ну у меня принцип практически тот же в последнем примере, плюс учитывается альфа канал. Возможно это из-за того ,что на зеленом границы контрастней выглядят визуально

_____________