Перейти к содержимому

Сервис обмена электронных валют

Партнерская программа Kredov

Прозрачность и наложение двух изображений

#1 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71
0

Отправлено 29 Ноябрь 2010 - 22:09

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

<?php
function WaterMark($filename)
{
$ext = array(1=>".gif",".jpg",".png");
$inf = getimagesize($filename);
$ext = $ext[$inf[2]];
// создаем jpeg из файла
if ($ext==".gif")
{
$src_img = imagecreatefromgif($filename);
}
if ($ext==".jpg")
{
$src_img = imagecreatefromjpeg($filename);
}
if ($ext==".png")
{
$src_img = imagecreatefrompng($filename);
}
$xi = imagesx($src_img);
$yi = imagesy($src_img);
$logo = imagecreatefrompng("../../media/logo.png");
$xl = imagesx($logo);
$yl = imagesy($logo);
$xi = ($xi/2)-($xl/2);
$yi = ($yi/2)-($yl/2);
imagecopy($src_img, $logo, $xi, $yi, 0, 0, $xl, $yl);
//сохраняем результат
if ($ext==".gif")
{
imagegif($src_img, $filename);
}
if ($ext==".jpg")
{
imagejpeg($src_img, $filename);
}
if ($ext==".png")
{
imagepng($src_img, $filename);
}
imagedestroy($src_img);
imagedestroy($logo);
return true;
}
?>

 

 

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85
Советую обратить внимание на следующее:
  1. Наложение картинок с помощью PHP
  2. Оптимизация картинок
  3. Как наложить картинку на фон?
  4. Выполняю различные действия с изображениями (также делаю слайд-шоу)
  5. Создаю фрактальные изображения для разных целей

#2 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 30 Ноябрь 2010 - 01:04

surfer, тут нужно применять не imagecopy(), а imagecopymerge(), последний параметр которой определяет прозрачность второй картинки от 0 до 100. Если 0 - вторая картинка (источник-src) непрозрачна, 100 - вторая картинка (источник-src) полностью прозрачна
Так что замени в своём коде:
imagecopy($src_img, $logo, $xi, $yi, 0, 0, $xl, $yl);
на
imagecopymerge($src_img, $logo, $xi, $yi, 0, 0, $xl, $yl, 50); // watermark с 50% прозрачностью

  • 0

#3 surfer

surfer
    Topic Starter
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 30 Ноябрь 2010 - 04:53

это не то, он делает прозрачность всего водного знака, а не прозрачность прозрачности :)
  • 0

#4 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 30 Ноябрь 2010 - 11:39

surfer, То есть тебе надо сделать так: У тебя есть одно изображение, и тебе надо на него наложить другое изображение, которое частично прозрачно или что? Чем тебя данный вариант не устраивает?
  • 0

#5 surfer

surfer
    Topic Starter
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 30 Ноябрь 2010 - 12:16

твой вариант меняет прозрачность накладываемого изображения, а мне надо чтоб прозрачные области накладываемого изображения оставались прозрачными при наложении на gif
  • 0

#6 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 02 Декабрь 2010 - 00:56

surfer, стоит поучить мат-часть GIF не поддерживает альфа канал, а поддерживает только бинарную прозрачность:

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

Более полезная информация:

В компьютерной графике альфа-композиция обозначает процесс комбинирования изображения с фоном с целью создания эффекта частичной прозрачности.
Альфа-канал, также известный как маска-канал, это просто способ объединить переходную прозрачность с изображением. Формат GIF поддерживает простую бинарную прозрачность (когда любой пиксель может быть либо полностью прозрачным, либо абсолютно непрозрачным). Формат PNG позволяет использовать 254 или 65534 уровня частичной прозрачности.

Все три типа PNG изображений («TrueColor», «GrayScale» и индексированная палитра) могут содержать альфа-информацию, хотя обычно она применяется лишь с «TrueColor» изображениями. Вместо того, чтобы сохранять три байта для каждого пикселя (красный, зелёный и синий, RGB), сохраняются четыре: красный, зелёный, синий и альфа, таким образом получается RGBA.


Поэтому вывод, тебе не удастся наложить правильно изображение с полупрозрачными пикселями на gif-картинку. Это можно сделать только как я уже тебе сказал, методами GDlib. Но оба изображения должны быть не прозрачными или с бинарной прозрачностью. Но как я успел заметить, там тоже свои тонкости, изображение PNG становится темным, но прозрачным, при наложении от gif, возможно тут сказывается truecolor, поэтому советую создавать изображения не функциями imagecreatefrompng, imagecreatefromgif, imagecreatefromjpeg, а создавать сначала пустой лист true color с помощью - imagecreatetruecolor, а затем уже на этот лист копировать исходное изображение и накладывать водяной знак
  • 0


Оформление форума – IPBSkins.ru