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

Форум PHP

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

 

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

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

тема: прозрачность при ресайзе. теория
 
 автор: Рома   (02.02.2010 в 18:25)   письмо автору
 
 

делаю так:
создаю подложку нужных размеров, сохраняю изображение в переменную, масштабирую изображение в размеры подложки в зависимости от миме типа.
как изменить алгоритм ресайза, чтоб уменьшенная копия оставляла прозрачность в тех местах изображения, где она имеется в исходном изображении?

  Ответить  
 
 автор: sim5   (03.02.2010 в 05:26)   письмо автору
 
   для: Рома   (02.02.2010 в 18:25)
 

А какой формат у исходного изображения?

  Ответить  
 
 автор: Рома   (03.02.2010 в 13:57)   письмо автору
 
   для: sim5   (03.02.2010 в 05:26)
 

У меня есть функция, которая некоторые изображения с прозрачным фоном уменьшает и оставляет прозрачность, а в некоторых изображениях прозрачночть игнорируется. Вот и решил поинтересоваться, как это делать правильно, потому что обработка картинок через одну-две не айс.

<?php

 
// функция генерации превью
 //           путь к файлу  имя        мах шир   max выс   куда сохранять
 
function resize_img($file$filename$f_out_w$f_out_h$patch_img_small)
 {
   
// снимаем параметры изображения
   
$f_getimagesize getimagesize($file);

   
// выщитываем коофициент пропорциональности исх. изображения
   
$in_w $f_getimagesize[0];
   
$in_h $f_getimagesize[1];
   
$in_ratio $in_w/$in_h;

   
// вычисляем размеры уменьшенной копии
   
$out_h $in_w $in_h floor($f_out_w/$in_ratio) : $f_out_h;
   
$out_w $in_h $in_w floor($f_out_h $in_ratio) : $f_out_w;

   
// создание пустого изображение нужного размера
   
$img_out imagecreatetruecolor($out_w$out_h);

   
// если может поддерживаться прозрачность
   
if ($f_getimagesize['mime'] == 'image/gif' || $f_getimagesize['mime'] == 'image/png')
   {
     
// создание белого цвета
     
$tr imagecolorallocate($img_out255255255);
     
// заливка изображения белым
     
imagefill($img_out00$tr);
     
// удаление белого цвета
     
imagecolortransparent($img_out$tr);
     
imagetruecolortopalette($img_outfalse256);
   }
   else
   {
     
imagecolorallocate($img_out000);
   }

   
// присваиваем изображение переменной в зависимости от типа
   
switch ($f_getimagesize['mime'])
   {
     case 
'image/gif'$img_in imagecreatefromgif($file); $f_ext '.gif'; break;
     case 
'image/jpeg'$img_in imagecreatefromjpeg($file); $f_ext '.jpg'; break;
     case 
'image/png'$img_in imagecreatefrompng($file); $f_ext '.png'; break;
   }

   
// масштабирование изображение
   
imagecopyresampled($img_out$img_in0000$out_w$out_h$in_w$in_h);

   
// сохранение в файл
   
switch ($f_getimagesize['mime'])
   {
     case 
'image/gif'imagegif($img_out$patch_img_small $filename $f_ext); break;
     case 
'image/jpeg'imagejpeg($img_out$patch_img_small $filename $f_ext); break;
     case 
'image/png'imagepng($img_out$patch_img_small $filename $f_ext); break;
   }

   
// сохраняем информацию о превьюшке в базе
   
$sql "INSERT INTO `image_small`
                  VALUES
                    (
                      '0',
                      '" 
mysql_real_escape_string($filename) . "',
                      '0',
                      '" 
mysql_real_escape_string($out_w) . "',
                      '" 
mysql_real_escape_string($out_h) . "'
                    )"
;

   
$result mysql_query($sql);
   if (!
$result)
   {
     
//echo "Error: " . mysql_error();
     
exit('Идет перезагрузка сервера базы данных, работа сайта возобновиться через 5 - 10 минут<br>');
   }

   
// чистим память
   
imagedestroy($img_in);
   
imagedestroy($img_out);
 }

?>

  Ответить  
 
 автор: sim5   (03.02.2010 в 16:24)   письмо автору
 
   для: Рома   (03.02.2010 в 13:57)
 

Я сейчас очень занят TDA9381PS/N2/ХХХХ, и до остального мне..., так что пока только информация к размышлению.
Создайте изображение, например, красный фон с прозрачностью 50% и помещенным на нем белом квадрате непрозрачном. Сохраните его в формате PNG24 (условно назовем его src.png). Теперь выведите это изображение в браузер двумя способами:
1. С помощью тега <img src="src.png" />
Что наблюдаем? Наблюдаем ОК - красный фон изображения полупрозрачен (в старых версиях IE этого только не увидеть).
2. С помощью GD библиотеки (учтите, что старые ее версии не поддерживали png - главную ее фичу, альфа канал):
<?
$im 
imagecreatefrompng("src.png");
header ("Content-type: image/png");
imagepng($im);

Что наблюдаем? Наблюдаем NOТ OК - красный фон изображения выводится непрозрачным.
А теперь выведем так:
<?
$im 
imagecreatefrompng("src.png");
imagesavealpha($imtrue);
header ("Content-type: image/png");
imagepng($im);

Что наблюдаем? Все ОК, как и при выводе тегом.
imagesavealpha - указывает сохранять полную информацию об альфа канале (в отличии от одного уровня (цвета) прозрачности) в PNG изображении.
Теперь наложим изображение на ранее заготовленную подложку (изменение размеров на суть не влияет, но будем изменять):
<?
//пусть исходное 300х300
$im imagecreatefrompng("src.png");
//подложка 100х100
$ims imagecreatetruecolor(100,100);
//цвет подложки
$col imagecolorallocate($ims000);
//указываем его как прозрачный
imagecolortransparent($ims$col);
imagefill($ims00$col);
//эту строку пока оставим заремированной
//imagealphablending($ims,false);
imagesavealpha($imstrue);
imagecopyresampled($ims$im0000100100300300);
header ("Content-type: image/png");
imagepng($ims);
imagedestroy($im);
imagedestroy($ims);

Что наблюдаем? Красный фон исходного изображения имеет прозрачность 50%, но он явно не того цвета (по умолчанию фон страницы белый), так как накладывается на черный фон подложки. И причина не в том, что мы забыли сделать его прозрачным (это сделано) - выведите ресурс im, заремировав лишние строки в коде, подложка будет выведена прозрачной. А вот теперь разремируйте строку imagealphablending($ims,false);, и все будет как положено - эскиз исходника также будет иметь красный цвет с прозрачностью 50%.
imagealphablending позволяет выбрать один из двух способов работы с альфа-каналом. Если второй параметр этой функции установлен в true, то при рисовании полупрозрачным цветом новое изображение частично накладывается на старое. Если же он установлен в false, то происходит полное замещение пикселей исходного изображения на пиксели нового.

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

  Ответить  
 
 автор: Рома   (03.02.2010 в 22:36)   письмо автору
 
   для: sim5   (03.02.2010 в 16:24)
 

спасибо.

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

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