|
|
|
| Привет. Есть скрипт, который загружает файл в папку, потом уменьшает изображение и кладет его в другую папку. Проблема в том, что, что бы не терять цвета, надо пользовать imagecreatetruecolor, которая создает избражение черного цвета. Но при загрузке гифов или пнг, нужно сохранять прозрачности.
Пробовал так:
$color = imagecolorallocate($dest_img, 0, 0, 0);
imagecolortransparent($dest_img, $color);
Цвет действительно вырезается, но остается черный ореол вокруг изображения. Можно ли как-то в место черно для пнг и гифиов ставить сразу прозраный? | |
|
|
|
|
|
|
|
для: devil943
(15.11.2008 в 15:24)
| | Вообщем после долгих мучений пришел вот к какому выводу: если создавать пустое изображение с помощью imagecreatetruecolor, то прозрачность не наложится, е если пользовать imagecreate, то картинка сильно теряет цвета. Причем создается впечатление, что imagecolortransparent применяется не только для $dest_img (путого изображения), но и для конечного, наложенного с помощью imagecopyresampled... | |
|
|
|
|
|
|
|
для: devil943
(15.11.2008 в 15:24)
| | Неужели никто не знает? | |
|
|
|
|
|
|
|
для: devil943
(15.11.2008 в 21:45)
| | Знаю только что для работы с прозрачностью изображение конвертируют в палитровое imagetruecolortopalette | |
|
|
|
|
|
|
|
для: Valick
(15.11.2008 в 22:06)
| | Ой... | |
|
|
|
|
|
|
|
для: Trianon
(15.11.2008 в 22:12)
| | Шо ой?)) Поправте если не прав | |
|
|
|
|
|
|
|
для: Valick
(15.11.2008 в 22:14)
| | Дык проблема в том, что тогда цвета потеряются. В трюколоре цветов на пару порядков больше. | |
|
|
|
|
|
|
|
для: devil943
(15.11.2008 в 15:24)
| | Народ, помогите, я в тупике! | |
|
|
|
|
|
|
|
для: devil943
(16.11.2008 в 13:30)
| | А как вы хотите, при уменьшении изображения происходит интерполяция цвета, и потеря цвета на участках изображения неизбежна. Создайте изображение шириной в 256рх и поместите на нем 256 цветов, а теперь уменьшите его по ширине в два раза. Сколько цветов будет?
Ореол на изображении останется, это следствие смешивания накладываемого изображения с фоном нижележащим (вы ведь с truecolor палитрой работаете в своих примерах). Для того чтобы избежать этого выбирайте прозрачный цвет равный цвету фона на котором будет находиться в последствии это изображение.
Поступите другим образом. Для изображений GIF, создайте в Фотошоп, например, нужную размером подложку, на которую вы в последствии и будете копировать gif-изображения. Откройте шопик, создайте новое изображение, например, 60х60 рх. Скопируйте фон. Теперь отключите фон и полученный новый слой в следствии копирования. Сохраните это изображения для Web как gif с прозрачностью, и с числом цветов в палитре равным 2. Назовем его, например, back.gif, тогда:
<?
$in = imagecreatefromgif('back.gif'); //подложка
$im = imagecreatefromgif('1.gif'); //то что нужно уменьшить (два цвета)
imagecopyresized($in, $im, 0, 0, 0, 0, 60, 60, 300, 300);
imagegif($in, 'small_1.gif');
|
Есть ли теперь ореол? | |
|
|
|
|
 64 Кб |
|
|
для: devil943
(16.11.2008 в 13:30)
| |
<?
/* Создаем изображение GIF из файла */
elseif($size_img[2]==1)
// Прозрачность для GIF.
{
$src_img=imagecreatefromgif($upfile);
imagealphablending($dest_img, false);
imageSaveAlpha($dest_img, true);
//Записывает изображение $src_img на диск под именем $upfile в формате PNG.
imagepng($src_img, $upfile);
}
--------------------------------------------------------------
imagecopyresampled($dest_img, $src_img, 0, 0, 0, 0, $w, $h, $size_img[0], $size_img[1]);
if($size_img[2]==2) imagejpeg($dest_img, $save_path, $quality);
elseif($size_img[2]==1) imagepng($dest_img, $save_path);
elseif($size_img[2]==3) imagepng($dest_img, $save_path);
|
| |
|
|
|
|
|
|
|
для: serjinio
(17.11.2008 в 10:53)
| | Сохранение GIF изображения с прозрачностью, это значит GIF, а не PNG. И GIF можно уменьшить на лету и сохранить без ореола, а для этого нужно работать с индексированной палитрой:
<?
$wb = 60;
$hb = 60;
//шаблон
$in = imagecreatetruecolor($wb,$hb);
$black = imagecolorallocate ($in, 0, 0, 0);
//прозрачность
imagecolortransparent($in,$black);
$im = imagecreatefromgif('1.gif');
//узнаем число цветов в палитре
$palette = imagecolorstotal($im);
//преобразуем шаблон в индексированную палитру
imagetruecolortopalette($in, true, $palette);
//изменяем размер
$wd = imagesx($im);
$hd = imagesy($im);
imagecopyresized($in, $im, 0, 0, 0, 0, $wb, $hb, $wd, $hd);
//сохраняем в GIF
imagegif($in, 'small_1.gif');
|
| |
|
|
|
|
|
|
|
для: sim5
(18.11.2008 в 08:55)
| | Спасибо, гиф, как и пнг работают!
Мне кажется лучше эту тему как-то зарепить или сдлеать что-то типа фака по графическому модулю пхп, так как поюзав поиск, где нашел множетво тем про про прозрачности, в частности. | |
|
|
|
|
|
|
|
для: devil943
(19.11.2008 в 21:23)
| | GIf как Png уж никак не могут работать ;-) Другое дело, что вы можете все хранить в png формате, беда только в том, что прозрачность этого формата не понимает IE. | |
|
|
|
|
 216 байт |
|
|
для: sim5
(18.11.2008 в 08:55)
| | правда работает без ореола в ие, но на некоторых картинках вылезает черный фон подложки
оригинал и скрин присоединил | |
|
|
|
|
 18 Кб |
|
|
для: serjinio
(21.11.2008 в 19:39)
| | скрин | |
|
|
|
|
|
|
|
для: serjinio
(21.11.2008 в 19:39)
| | А зачем такое изображение уменьшать? Или вы просто указывате изображению прозрачный цвет?
PS. Все потому, что в данном случае нужно просто скопировать это изображение (правда ради эксперемента, ибо смысла нет в этой операции), а не изменять размер. Посмотрите в фотошопе на маску исходного изобаражения. При копировании изображения, и при указании начальных координат копирования на подложке 0,0, копируемое изображение будет сдивнуто на 1 пикслеь вверх и вправо. При этом на копируемом изображении цвет черный останется (части контура дома), он не будет попадать в область маски (она только у подложки), что вы и принимаете за "остатки черного". | |
|
|
|
|
|
|
|
для: sim5
(21.11.2008 в 20:06)
| | Это только эксперимент..что под руку попало... | |
|
|
|
|
 63.3 Кб |
|
|
для: devil943
(16.11.2008 в 13:30)
| | Прозрачность для png
<?php
elseif($size_img[2]==3) $src_img=imagecreatefrompng($upfile);
{
// Прозрачность для PNG.
// Применяется для установки прозрачности изображений в формате PNG= true создается полноценный альфа-канал.
@imagesavealpha($dest_img, TRUE);
@$cc=imagecolorallocatealpha($dest_img, 255, 255, 255, 127);
// Производит заливку области внутри контура на изображении $dest_img ,
// $cc - идентификатор цвета.
imagefill($dest_img, 0, 0, $cc);
}
|
| |
|
|
|
|
|
|
|
для: serjinio
(17.11.2008 в 12:00)
| | Спасибо, попробую. | |
|
|
|