Про прозрачность у PNG

 
0
 
PHP
ava
savage | 30.03.2009, 10:30
Люди добрые помогите - объясните как можно решить проблему с ресайзом png картинки содержащей прозрачный фон.
Весь поиск излазил ни чего не помогает.
Задача такая: есть png картинка, в ней нарисован некий объект. Объект находится на прозрачном фоне. После того как скрипт менает размер картинки - сама картинка ломается (изображение жестко портится) + фон черный а не прозрачный.
Чем только не пробовал исправить ничего не помогает. Нашел только решение для gif но надо именно png трансформировать.
Сейчас делаю так:

$img=imagecreatefrompng('test.png');
$trueColor=imagecreatetruecolor(150,150);
imageAlphaBlending($img, false);
imageSaveAlpha($img, true);
imagecopyresampled($trueColor,$img,0,0,0,0,150,150,111,111);
header("Content-type: image/png");
imagepng($trueColor);
Ответы (16)
ava
azesmcar | 30.03.2009, 09:38 #
savage

<?php
$img=imagecreatefrompng('test.png');
$color = imagecolorallocate($img, 0, 0, 0);
$trueColor=imagecreatetruecolor(150,150);
imageAlphaBlending($img, false);
imageSaveAlpha($img, true);
imagecopyresampled($trueColor,$img,0,0,0,0,150,150,111,111);
imagecolortransparent($trueColor, $color);
header("Content-type: image/png");
imagepng($trueColor);
?>



imagecolortransparent($trueColor, $color); //вот это добавлено, определяем черный, как прозрачный.
ava
savage | 30.03.2009, 09:45 #
azesmcar, к сожалению, так тоже не работает smile
ava
azesmcar | 30.03.2009, 09:47 #
savage у меня работает, скинь свою ПНГ куда нибудь, посмотрю
ava
savage | 30.03.2009, 09:57 #
Вот такая http://www.nelis.ru/test.png, но я уже на каких только не пробовал.
ava
azesmcar | 30.03.2009, 10:03 #
savage

http://217.73.200.72/test.png - сохрани, и попробуй на этом, с моей добавкой
ava
savage | 30.03.2009, 10:06 #
ооооооооооо! Заработало! А что ты сделал?
ava
azesmcar | 30.03.2009, 10:11 #
savage сохранил в фотошопе как PNG - save for web...
разница в DPI, у тебя 72DPI было, у меня 96. Не могу точно сказать почему это так, но другой разницы не вижу. smile
ava
savage | 30.03.2009, 10:15 #
мда..... smile щас уж тогда и не знаю как быть...... проблема и решена и не решена smile
А то просто смысл теряется скрипты писать если человеку пере сохранять все все равно надо.
Но все рано - тебе спасибо smile
ava
azesmcar | 30.03.2009, 10:16 #
savage щас поищем в чем проблема...
ava
savage | 30.03.2009, 10:22 #
azesmcar, я вот еще че подумал. Этоже получается не правильно - мы черный цвет делаем прозрачны. А если на png`шке черные области есть. получается они будут дырами.
ava
azesmcar | 30.03.2009, 10:42 #
Цитата


azesmcar, я вот еще че подумал. Этоже получается не правильно - мы черный цвет делаем прозрачны. А если на png`шке черные области есть. получается они будут дырами.



этого не будет, тут проблем нету..но вот я посмотрел..проблема не в DPI, GD нормально работает с ним..что-то тут другое..пока смотрим

Добавлено позднее:
savage не пойму что-то, ты сменил картинку на сервере? я ее снова скачал - у меня заработало..без каких либо изменений
ava
savage | 30.03.2009, 11:32 #
azesmcar, нет картинку не менял - может кЭш?
Я попробовал с картинкой, с моего сайта, - по прежнему - не робит.
ava
azesmcar | 30.03.2009, 11:35 #
да нет, даже другим браузером проверил..работает..
ava
savage | 30.03.2009, 12:18 #
у меня не пашет ((((
ava
savage | 30.03.2009, 18:50 #
В общем все понятно - в итоге все упирается в "глубину" картинки. C 8ми битовой png`шкой можно не химичить ничего - бесполезно.
Вот, моя картинка была 8 битная: http://www.nelis.ru/test.png
azesmcar, сохранил картинку в фотошопе и картинка щас имеет глубину 32 бита http://217.73.200.72/test.png - с ней нормально работает и код который я приводил (правда две строчки пришлось доработать).

В общем вердикт такой, если png`шка глубиной от 24 bit, то смело можно юзать код:

$img=imagecreatefrompng('test.png');
$trueColor=imagecreatetruecolor(150,150);
imageAlphaBlending($trueColor, false);
imageSaveAlpha($trueColor, true);
imagecopyresampled($trueColor,$img,0,0,0,0,150,150,111,111);
header("Content-type: image/png");
imagepng($trueColor);


Но задача я думаю не решена, было бы универсальней повышать глубину до 24 bit у картинки если глубина маленькая. А как это сделать - кто знает алгоритм (функция такого типа есть у ImageMagik класса в PHP, а хотелось бы стандартными средствами обойтись)?
ava
azesmcar | 30.03.2009, 19:43 #
savage

http://www.imagemagick.org/script/index.php - тут есть работа с изображениями на том уровне который тебе нужен.

Добавлено позднее:
Цитата


Но задача я думаю не решена, было бы универсальней повышать глубину до 24 bit у картинки если глубина маленькая. А как это сделать - кто знает алгоритм (функция такого типа есть у ImageMagik класса в PHP, а хотелось бы стандартными средствами обойтись)?



только заметил что ты написал smile вроде в стандартном GD нету
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить