[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с функцией imagecopymerge.
Ivan
Проблема следующая: функция работает некорректно.
Если судить по документации, то при указании последнего параметра (прозрачность) результата быть не должно, исходная картинка поменяться не должна. У меня же выходит чёрный квадрат.
При повышении прозрачности крадрат постепенно превращается в накладываемую картинку, т.е. ощущение, что исходная картинка и есть чёрный квадрат, но это не так.

Исходная картинка - true color.

Пробовал на версиях 4.3.2 и 4.4.4

Если кто сталкивался и решил такую проблему, пожалуйста, подскажите, что сделать.

Заранее благодарен!

Код ниже:




tools/copyright_image.php
class ImageManager{
function ImageManager(){
}
function read($name){
return null;
}
function write($res){
}
}
class ImageManagerGif extends ImageManager{
function ImageManagerGif(){
$this->ImageManager();
}
function read($name){
return @imagecreatefromgif($name);
}
function write($res){
imagegif($res);
}
}
class ImageManagerJpg extends ImageManager{
function ImageManagerJpg(){
$this->ImageManager();
}
function read($name){
return @imagecreatefromjpeg($name);
}
function write($res){
imagejpeg($res);
}
}
class ImageManagerPng extends ImageManager{
function ImageManagerPng(){
$this->ImageManager();
}
function read($name){
return @imagecreatefrompng($name);
}
function write($res){
imagepng($res);
}
}
class CopyrightImage{
var $image_res = "";
var $alfa_image_res = "";
var $image;
var $Alpha_image;
var $AlphaImageWidth;
var $AlphaImageHeight;
var $type="jpg";
var $alphatype="jpg";
var $width;
var $height;
var $WJamp = 0;
var $HJamp = 0;
var $alpha = 100;
var $managers;

function CopyrightImage($image_res, $alfa_image_res, $alpha, $type, $alphatype){
$this->image_res=$image_res;
$this->alfa_image_res=$alfa_image_res;
$this->type = $type;
$this->alphatype = $alphatype;
$this->alpha=$alpha;

$image_size=getimagesize($this->image_res);
$this->width = $image_size[0];
$this->height = $image_size[1];

$alfa_image_size=getimagesize($this->alfa_image_res);
$this->AlphaImageWidth = $alfa_image_size[0];
$this->AlphaImageHeight = $alfa_image_size[1];

$this->managers=Array("gif"=>new ImageManagerGif(), "jpg"=>new ImageManagerJpg(), "png"=>new ImageManagerPng());
}

function tablePart($Backgroundparam, $Alphaparam){
$part = ceil($Backgroundparam/$Alphaparam);
return $part;
}

function getImage($imagename,$type){
return $this->managers[$type]->read($imagename);
}

function visualize(){
$this->construct();
$this->managers[$this->type]->write($this->image);
}

function construct(){
//$this->image = $this->getImage($this->image_res,$this->type);
$image = $this->getImage($this->image_res,$this->type);
$this->image=imagecreatetruecolor($this->width, $this->height);
imagecopy($this->image, $image, 0, 0, 0, 0, $this->width, $this->height);

$this->Alpha_image = $this->getImage($this->alfa_image_res,$this->alphatype);
$this->addAlphapart();
}

function addAlphapart(){
$this->WJamp = 0;
$this->HJamp = 0;
for($j = 0; $j<$this->tablePart($this->width, $this->AlphaImageWidth); $j++){
$this->HJamp = 0;

for($i = 0; $i<$this->tablePart($this->height, $this->AlphaImageHeight); $i++){
//$ptr_white = imageColorAllocate($this->Alpha_image,255,255,255);
//imageColorTransparent($this->Alpha_image,$ptr_white);

//imagecopy($this->image,$this->Alpha_image,$this->WJamp,$this->HJamp,0,0,$this->AlphaImageWidth,$this->AlphaImageHeight);
imagecopymerge($this->image,$this->Alpha_image,$this->WJamp,$this->HJamp,0,0,$this->AlphaImageWidth,$this->AlphaImageHeight, $this->alpha);
$this->HJamp = $this->HJamp+$this->AlphaImageHeight;
}
$this->WJamp = $this->WJamp+$this->AlphaImageWidth;
}
return $this->image;

}

}
function getTempFileName($image_res, $alfa_image_res, $alpha){
$tmp_file_name="tmp/".md5("$image_res:$alfa_image_res:$alpha").".tmp";
return $tmp_file_name;
}
function getImageType($ext){
switch($ext){
case "gif": return "gif";
case "jpg": return "jpg";
case "jpeg": return "jpg";
case "png": return "png";
}
return "jpg";
}
function copyrightImage($image_res, $alfa_image_res, $alpha){
$type = getFileExt($image_res);
$alphatype = getFileExt($alfa_image_res);
$tmp_file_name=getTempFileName($image_res, $alfa_image_res, $alpha);
//if(!file_exists($tmp_file_name)){
$c = new CopyrightImage($image_res, $alfa_image_res,$alpha,$type,$alphatype);
ob_start();
$c->visualize();
$result=ob_get_contents();
saveToFile($tmp_file_name, $result);
ob_end_clean();
//}
header("Content-type: image/".getImageType($type));
readfile($tmp_file_name);
}
?>





tools/filetools.php
function copyFile($from, $to, $encodeFrom = 0, $encodeTo = 0){
$handleFrom = fopen($from, "rb");
$handleTo = fopen($to, "wb");
while (!feof($handleFrom)){
$buffer = fgets($handleFrom, 4096);
if($encodeFrom!=$encodeTo)
$buffer = iconv($encodeFrom, $encodeTo, $buffer);
fputs($handleTo, $buffer);
}
fclose($handleFrom);
fclose($handleTo);
return true;
}
function saveToFile($file,$content){
$handle = fopen($file, "w");
fputs($handle, $content);
fclose($handle);
}
function getFileContents($file){
$handle = fopen($file, "r");
$contents = fread($handle, filesize($file));
fclose($handle);
return $contents;
}
function saveGzFile($from, $to){
$handleFrom = fopen($from, "rb");
$handleTo = gzopen($to, "wb");
while (!feof($handleFrom)){
$buffer = fgets($handleFrom, 4096);
fputs($handleTo, $buffer);
}
fclose($handleFrom);
fclose($handleTo);
return true;
}
function getFileExt($fileName){
$fileParts=explode(".",$fileName);
$fileExt=$fileParts[sizeof($fileParts)-1];
$fileExt=strtolower($fileExt);
return $fileExt;
}
?>





test.php
include "tools/copyright_image.php";
include "tools/filetools.php";

copyrightImage("goods.jpg", "water.gif", 50);
?>



Спустя 22 часа, 59 минут, 28 секунд (25.11.2006 - 13:15) Ivan написал(а):
Если кто столкнётся с этой проблемой, не сомневайтесь imagecopymerge работает некорректно. Решение я нашёл, если кому понадобится - пишите в личку.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.