Dr.Hell 0 Опубликовано 22 февраля, 2009 Жалоба Share Опубликовано 22 февраля, 2009 Всем добрый день! Поиском нашел только две темы, которые как-то касаются этого вопроса, но в обеих нет решения. Если делать вотермарк из гифа, то у него получаются резкие контуры, это не всегда красиво смотрится. У пнг же есть свой альфаканал, в который можно сохранить любую прозрачность, какую вздумается. В общем, не долго думая, поставил на файл image_manipulator_GD2.php вот такую заплатку: function merge($merge_img="", $x_left=0, $y_top=0, $merge_opacity=70, $trans_colour="FF0000") { $this->mi = $merge_img; $this->xx = ($x_left < 0) ? $this->q+$x_left : $x_left; $this->yy = ($y_top < 0) ? $this->r+$y_top : $y_top; $this->mo = $merge_opacity; $this->tc = $trans_colour; $this->tr = $this->hex2rgb(substr($this->tc,0,2)); $this->tg = $this->hex2rgb(substr($this->tc,2,2)); $this->tb = $this->hex2rgb(substr($this->tc,4,2)); $this->md = @getimagesize($this->mi); $this->mw = $this->md[0]; $this->mh = $this->md[1]; $this->mm = ($this->md[2] < 4) ? ($this->md[2] < 3) ? ($this->md[2] < 2) ? imagecreatefromgif($this->mi) : imagecreatefromjpeg($this->mi) : imagecreatefrompng($this->mi) : Null; if ($this->md[2] == 3) // Если PNG, то сливаем картинки с альфаканалом от пнг. { ImageAlphaBlending($this->t, true); ImageCopy($this->t, $this->mm, $this->xx, $this->yy, 0, 0, $this->mw, $this->mh); } else // Для GIF и JPEG { for($this->ypo = 0; $this->ypo < $this->mh; $this->ypo++) { for($this->xpo = 0; $this->xpo < $this->mw; $this->xpo++) { $this->indx_ref = @imagecolorat($this->mm, $this->xpo, $this->ypo); $this->indx_rgb = @imagecolorsforindex($this->mm, $this->indx_ref); if(($this->indx_rgb['red'] == $this->tr) && ($this->indx_rgb['green'] == $this->tg) && ($this->indx_rgb['blue'] == $this->tb)) { // transparent colour, so ignore merging this pixel } else { @imagecopymerge($this->t, $this->mm, $this->xx+$this->xpo, $this->yy+$this->ypo, $this->xpo, $this->ypo, 1, 1, $this->mo); } } } } @imagedestroy($this->mm); }[/code] Собственно, все, что я добавил, это вот такой код: [code] if ($this->md[2] == 3) // Если PNG, то сливаем картинки с альфаканалом от пнг. { ImageAlphaBlending($this->t, true); ImageCopy($this->t, $this->mm, $this->xx, $this->yy, 0, 0, $this->mw, $this->mh); } else // Для GIF и JPEG { . . . } Может быть кому-то пригодится. =) При использовании PNG в качестве вотермарка, теряют свой смысл параметры прозрачности и прозрачного цвета (последние два параметра), поэтому, если нужен полупрозрачный вотермарк, то он должен быть сохранен в файл уже полупрозрачным. Ссылка на сообщение Поделиться на другие сайты
support 447 Опубликовано 23 февраля, 2009 Жалоба Share Опубликовано 23 февраля, 2009 Привет! Спасибо большое, если не против, добавлю в следующей версии Вашу заплатку. Ссылка на сообщение Поделиться на другие сайты
Dr.Hell 0 Опубликовано 23 февраля, 2009 Автор Жалоба Share Опубликовано 23 февраля, 2009 Абсолютно не против! =) Рад помочь! Ссылка на сообщение Поделиться на другие сайты
support 447 Опубликовано 23 февраля, 2009 Жалоба Share Опубликовано 23 февраля, 2009 Ещё раз спасибо. В текущий код уже добавил. В том числе и данное исправление будет в следующей версии, скорей всего в марте. Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения