Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: прозрачность и получпрозрачность в изображениях
 
 автор: devil943   (15.11.2008 в 15:24)   письмо автору
 
 

Привет. Есть скрипт, который загружает файл в папку, потом уменьшает изображение и кладет его в другую папку. Проблема в том, что, что бы не терять цвета, надо пользовать imagecreatetruecolor, которая создает избражение черного цвета. Но при загрузке гифов или пнг, нужно сохранять прозрачности.
Пробовал так:
$color = imagecolorallocate($dest_img, 0, 0, 0);
imagecolortransparent($dest_img, $color);

Цвет действительно вырезается, но остается черный ореол вокруг изображения. Можно ли как-то в место черно для пнг и гифиов ставить сразу прозраный?

  Ответить  
 
 автор: devil943   (15.11.2008 в 16:34)   письмо автору
 
   для: devil943   (15.11.2008 в 15:24)
 

Вообщем после долгих мучений пришел вот к какому выводу: если создавать пустое изображение с помощью imagecreatetruecolor, то прозрачность не наложится, е если пользовать imagecreate, то картинка сильно теряет цвета. Причем создается впечатление, что imagecolortransparent применяется не только для $dest_img (путого изображения), но и для конечного, наложенного с помощью imagecopyresampled...

  Ответить  
 
 автор: devil943   (15.11.2008 в 21:45)   письмо автору
 
   для: devil943   (15.11.2008 в 15:24)
 

Неужели никто не знает?

  Ответить  
 
 автор: Valick   (15.11.2008 в 22:06)   письмо автору
 
   для: devil943   (15.11.2008 в 21:45)
 

Знаю только что для работы с прозрачностью изображение конвертируют в палитровое imagetruecolortopalette

  Ответить  
 
 автор: Trianon   (15.11.2008 в 22:12)   письмо автору
 
   для: Valick   (15.11.2008 в 22:06)
 

Ой...

  Ответить  
 
 автор: Valick   (15.11.2008 в 22:14)   письмо автору
 
   для: Trianon   (15.11.2008 в 22:12)
 

Шо ой?)) Поправте если не прав

  Ответить  
 
 автор: devil943   (15.11.2008 в 23:34)   письмо автору
 
   для: Valick   (15.11.2008 в 22:14)
 

Дык проблема в том, что тогда цвета потеряются. В трюколоре цветов на пару порядков больше.

  Ответить  
 
 автор: devil943   (16.11.2008 в 13:30)   письмо автору
 
   для: devil943   (15.11.2008 в 15:24)
 

Народ, помогите, я в тупике!

  Ответить  
 
 автор: sim5   (17.11.2008 в 09:48)   письмо автору
 
   для: 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$im00006060300300);
imagegif($in'small_1.gif');

Есть ли теперь ореол?

  Ответить  
 
 автор: serjinio   (17.11.2008 в 10:53)   письмо автору
64 Кб
 
   для: devil943   (16.11.2008 в 13:30)
 

<?
/* Создаем изображение GIF из файла */
elseif($size_img[2]==1)
// Прозрачность для GIF.
     
{
    
$src_img=imagecreatefromgif($upfile);
    
imagealphablending($dest_imgfalse);
    
imageSaveAlpha($dest_imgtrue);
//Записывает изображение $src_img на диск под именем $upfile в формате PNG.    
    
imagepng($src_img$upfile);
    }
--------------------------------------------------------------
imagecopyresampled($dest_img$src_img0000$w$h$size_img[0], $size_img[1]);
if(
$size_img[2]==2imagejpeg($dest_img$save_path$quality);                       
elseif(
$size_img[2]==1imagepng($dest_img$save_path);                       
elseif(
$size_img[2]==3imagepng($dest_img$save_path);

  Ответить  
 
 автор: sim5   (18.11.2008 в 08:55)   письмо автору
 
   для: serjinio   (17.11.2008 в 10:53)
 

Сохранение GIF изображения с прозрачностью, это значит GIF, а не PNG. И GIF можно уменьшить на лету и сохранить без ореола, а для этого нужно работать с индексированной палитрой:
<?
$wb 
60;
$hb 60;
//шаблон
$in imagecreatetruecolor($wb,$hb);
$black imagecolorallocate ($in000);
//прозрачность
imagecolortransparent($in,$black);
$im imagecreatefromgif('1.gif');
//узнаем число цветов в палитре
$palette imagecolorstotal($im);
//преобразуем шаблон в индексированную палитру
imagetruecolortopalette($intrue$palette);
//изменяем размер
$wd imagesx($im);
$hd imagesy($im);
imagecopyresized($in$im0000$wb$hb$wd$hd);
//сохраняем в GIF
imagegif($in'small_1.gif');

  Ответить  
 
 автор: devil943   (19.11.2008 в 21:23)   письмо автору
 
   для: sim5   (18.11.2008 в 08:55)
 

Спасибо, гиф, как и пнг работают!

Мне кажется лучше эту тему как-то зарепить или сдлеать что-то типа фака по графическому модулю пхп, так как поюзав поиск, где нашел множетво тем про про прозрачности, в частности.

  Ответить  
 
 автор: sim5   (20.11.2008 в 05:35)   письмо автору
 
   для: devil943   (19.11.2008 в 21:23)
 

GIf как Png уж никак не могут работать ;-) Другое дело, что вы можете все хранить в png формате, беда только в том, что прозрачность этого формата не понимает IE.

  Ответить  
 
 автор: serjinio   (21.11.2008 в 19:39)   письмо автору
216 байт
 
   для: sim5   (18.11.2008 в 08:55)
 

правда работает без ореола в ие, но на некоторых картинках вылезает черный фон подложки

оригинал и скрин присоединил

  Ответить  
 
 автор: serjinio   (21.11.2008 в 19:42)   письмо автору
18 Кб
 
   для: serjinio   (21.11.2008 в 19:39)
 

скрин

  Ответить  
 
 автор: sim5   (21.11.2008 в 20:06)   письмо автору
 
   для: serjinio   (21.11.2008 в 19:39)
 

А зачем такое изображение уменьшать? Или вы просто указывате изображению прозрачный цвет?

PS. Все потому, что в данном случае нужно просто скопировать это изображение (правда ради эксперемента, ибо смысла нет в этой операции), а не изменять размер. Посмотрите в фотошопе на маску исходного изобаражения. При копировании изображения, и при указании начальных координат копирования на подложке 0,0, копируемое изображение будет сдивнуто на 1 пикслеь вверх и вправо. При этом на копируемом изображении цвет черный останется (части контура дома), он не будет попадать в область маски (она только у подложки), что вы и принимаете за "остатки черного".

  Ответить  
 
 автор: serjinio   (22.11.2008 в 20:21)   письмо автору
 
   для: sim5   (21.11.2008 в 20:06)
 

Это только эксперимент..что под руку попало...

  Ответить  
 
 автор: serjinio   (17.11.2008 в 12:00)   письмо автору
63.3 Кб
 
   для: devil943   (16.11.2008 в 13:30)
 

Прозрачность для png
<?php
elseif($size_img[2]==3$src_img=imagecreatefrompng($upfile);
{    
// Прозрачность для PNG.
// Применяется для установки прозрачности изображений в формате PNG= true создается полноценный альфа-канал.    
@imagesavealpha($dest_imgTRUE);
@
$cc=imagecolorallocatealpha($dest_img255255255127);
// Производит заливку области внутри контура на изображении $dest_img ,
// $cc - идентификатор цвета. 
 
imagefill($dest_img00$cc); 
}    

  Ответить  
 
 автор: devil943   (19.11.2008 в 19:58)   письмо автору
 
   для: serjinio   (17.11.2008 в 12:00)
 

Спасибо, попробую.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования