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

Форум PHP

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

 

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

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

тема: Работа с альфа каналом
 
 автор: Loki   (02.04.2008 в 16:50)   письмо автору
 
 

Стоит передо мной такая задачка. Требуется у имеющейся картинки сделать скругленные углы. Размеры картинки заранее известны, так что для этих целей вполне можно заготовить маску. Маска может быть как цветная, так и с альфа каналом. Вот только не нашел я в GD способа использовать эту маску, кроме как полным перебором всех пикселей. У кого есть опыт работы с графикой на PHP - как это возможно сделать?

   
 
 автор: Antohins   (02.04.2008 в 16:57)   письмо автору
 
   для: Loki   (02.04.2008 в 16:50)
 

Недавно где то читал статью как с помощью css скруглить углы. вроде на хабре. юз гугл

   
 
 автор: AlexSol   (02.04.2008 в 17:05)   письмо автору
 
   для: Loki   (02.04.2008 в 16:50)
 

с помошью flash можно, про css сомнительно

сделать скругленные углы у картинки

   
 
 автор: Loki   (02.04.2008 в 17:09)   письмо автору
 
   для: AlexSol   (02.04.2008 в 17:05)
 

CSS не подойдет. Скругленные углы там только с третьей версии и относятся они к блокам.

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

Да и в конце концов это возможно сделать через php, просто мне кажется что попиксельно рисовать альфа канал слишком расточительно. Вот и интересуюсь - есть ли более человеческий способ?

   
 
 автор: Antohins   (02.04.2008 в 17:16)   письмо автору
 
   для: Loki   (02.04.2008 в 17:09)
 

http://ballista.ru/scripts/swfir


и вот еще)

   
 
 автор: AlexSol   (02.04.2008 в 18:51)   письмо автору
 
   для: Loki   (02.04.2008 в 17:09)
 

да, с флешом или наложение или полупрозрачность (

   
 
 автор: Antohins   (02.04.2008 в 17:10)   письмо автору
 
   для: AlexSol   (02.04.2008 в 17:05)
 

Ничего сомнительного:
http://designformasters.info/posts/round-corners-no-image/


Помещаем изображение в див и с помощью кода(в ссылке сверху) округляем дви. все.

   
 
 автор: Loki   (02.04.2008 в 17:18)   письмо автору
 
   для: Antohins   (02.04.2008 в 17:10)
 

Если вы читали статью, на которую ссылаетесь, то должны понимать что вставить изображение в div с такими скруглениями невозможно.

   
 
 автор: mihdan   (02.04.2008 в 17:15)   письмо автору
 
   для: Loki   (02.04.2008 в 16:50)
 

Наложение маски:
http://mysitez.km.ua/Programming/?phptransmask

   
 
 автор: Loki   (02.04.2008 в 17:24)   письмо автору
 
   для: mihdan   (02.04.2008 в 17:15)
 

Это очевидное решение, но не поддерживающее полупрозрачность. Именно поэтому я и хочу использовать альфа канал. Кроме того, тут надо следить чтобы цвет рамки отличался от цветов на основной картинке. Совпадение маловероятно, но кто знает какого цвета клиент загрузит изображение:)

   
 
 автор: Loki   (04.04.2008 в 11:31)   письмо автору
 
   для: Loki   (02.04.2008 в 16:50)
 

Ну что, господа? Неужели в разгар 21 века всем хватает однопискельной прозрачности? Или в PHP пока нет более красивого способа нежели полный перебор?

   
 
 автор: mihdan   (04.04.2008 в 12:06)   письмо автору
 
   для: Loki   (04.04.2008 в 11:31)
 

Это пробовали? На мой взгляд интересный вариант! Но..

   
 
 автор: Loki   (04.04.2008 в 13:06)   письмо автору
 
   для: mihdan   (04.04.2008 в 12:06)
 

Это флеш. Я уже написал что флеш не подходит в силу своих специфических ограничений.

Пока выложу вариант который я родил, хотя он мне и не нравится. Очень надеюсь что у кого-то есть решение лучше.
<?
header
('Content-type: image/png');
$im imagecreatefromjpeg("test.jpg");
$mask imagecreatefrompng("alpha.png");
imagealphablending($imfalse);
imagesavealpha($imtrue);    

for (
$i=0$i<imagesx($mask); $i++)
{
    for (
$j=0$j<imagesy($mask); $j++)
    {
        
imagesetpixel($im$i$j, (imagecolorat($im$i$j)+(imagecolorat($mask$i$j)>>17<<24)));
    }
}

imagedestroy($mask);
imagepng($im);
imagedestroy($im);

   
 
 автор: Саня   (04.04.2008 в 14:19)   письмо автору
 
   для: Loki   (04.04.2008 в 13:06)
 

А imagecopy() не пробовали?

   
 
 автор: Loki   (04.04.2008 в 16:22)   письмо автору
 
   для: Саня   (04.04.2008 в 14:19)
 

Пробовал. Не совсем то, что нужно: он умеет сохранять альфа канал для того слоя где этот канал был изначально, но не умеет применять к слою где его изначально небыло.
То есть в случае imagecopy() получается абсолютно непрозрачный фон, на который наложено полупрозрачное изображение маски.

<?
header
('Content-type: image/png');
$im imagecreatefromjpeg("test.jpg"); //непрозрачный исходник
$mask imagecreatefrompng("alpha.png"); //полупрозрачная маска
imagecopy($im$mask0000imagesx($mask), imagesy($mask));
imagepng($im);

   
Rambler's Top100
вверх

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