【发布时间】:2016-11-29 10:53:51
【问题描述】:
我正在尝试将水印添加到不透明的图像中,我使用了此处给出的答案Watermarking an image with php 它大致完成了我想要的操作,但我不确定如何将它放到我想要的位置。
我想要做的是将图像水印添加到图像但添加不透明度, 我已经想知道我将如何去做,但我无法制定出让它工作的代码。
这就是我想要做的。获取水印并将图像添加到水印背景作为水印背景,然后将其与具有不透明度的图像合并。以便他们可以稍微看到水印后面的图像
代码
function Watermark ($image,$output,$overlay,$opacity=20){
if (!file_exists($image)) {
die("Image does not exist.");
}
// Set offset from bottom-right corner
$w_offset = 0;
$h_offset = 100;
$extension = strtolower(substr($image, strrpos($image, ".") + 1));
// Load image from file
switch ($extension){
case 'jpg':
$background = imagecreatefromjpeg($image);
break;
case 'jpeg':
$background = imagecreatefromjpeg($image);
break;
case 'png':
$background = imagecreatefrompng($image);
break;
case 'gif':
$background = imagecreatefromgif($image);
break;
default:
die("Image is of unsupported type.");
}
// Find base image size
$swidth = imagesx($background);
$sheight = imagesy($background);
// Turn on alpha blending
imagealphablending($background, true);
// Create overlay image
//$overlay = imagecreatefrompng($overlay);
$photo = imagecreatefromjpeg($image);
$watermark = imagecreatefrompng($overlay);
// Get the size of overlay
$owidth = imagesx($watermark);
$oheight = imagesy($watermark);
// This is the key. Without ImageAlphaBlending on, the PNG won't render correctly.
imagealphablending($photo, true);
// Copy the watermark onto the master, $offset px from the bottom right corner.
$offset = 10;
imagecopy($photo, $watermark, imagesx($photo) - imagesx($watermark) - $offset, imagesy($photo) - imagesy($watermark) - $offset, 0, 0, imagesx($watermark), imagesy($watermark));
// Output to the browser
imagejpeg($photo,$output);
// Overlay watermark
// Destroy the images
imagedestroy($background);
imagedestroy($watermark);
}
这个答案有一些错误,但我设法纠正了它们,它做了它要做的事情,但水印的不透明度和位置,谁能帮我解决这个问题。
这是我已经完成但无法正常工作的功能,
function _Watermark($input, $output, $watermark, $opacity=50){
$im = $this->imagecreatefrom($input);
$stamp = $this->imagecreatefrom($watermark);
// First we create our stamp image manually from GD
//$stamp = imagecreatetruecolor(100, 70);
//imagefilledrectangle($stamp, 0, 0, 99, 69, 0x0000FF);
//imagefilledrectangle($stamp, 9, 9, 90, 60, 0xFFFFFF);
//imagestring($stamp, 5, 20, 20, 'libGD', 0x0000FF);
//imagestring($stamp, 3, 20, 40, '(c) 2007-9', 0x0000FF);
// Set the margins for the stamp and get the height/width of the stamp image
$marge_right = 10;
$marge_bottom = 10;
$ix = imagesx($im);
$iy = imagesy($im);
$sx = imagesx($stamp);
$sy = imagesy($stamp);
list($iw, $ih, $type, $attr) = getimagesize($input);
list($sw, $sh, $type, $attr) = getimagesize($watermark);
//imagecopy($im, $stamp, $ix - $sx - $marge_right, $ix - $sy - $marge_bottom, 0, 0, $sx, $sy);
// copying relevant section from background to the cut resource
$cut = imagecreatetruecolor($sw, $sh);
echo ($ix - $sx - $marge_right)." x ".($iy - $sy - $marge_bottom)." | $sx x $sy<br/>";
imagecopy($cut, $im, 0, 0, $ix - $sx - $marge_right, $iy - $sy - $marge_bottom, $sx, $sy) ;
// copying relevant section from watermark to the cut resource
echo $sx." x ".$sy." | $sw x $sy<br/>";
imagecopy($cut, $stamp, 0, 0, $sx, $sy, $sw, $sh);
// insert cut resource to destination image
imagecopymerge($im, $cut, $ix - $sx - $marge_right, $iy - $sy - $marge_right, 0, 0, $sw, $sw, $opacity);
//imagecopymerge($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp), $opacity);
// Save the image to file and free memory
imagejpeg($im, $output);
imagedestroy($im);
imagedestroy($stamp);
return true;
}
private function imagecreatefrom($input){
$size = getimagesize($input);
if($size){
switch($size['mime']){
case 'image/jpeg':
$base = imagecreatefromjpeg($input);
imagealphablending( $base, false );
imagesavealpha( $base, true );
return $base;
break;
case 'image/png':
$base = imagecreatefrompng($input);
imagealphablending( $base, false );
imagesavealpha( $base, true );
return $base;
break;
case 'image/gif':
$base = imagecreatefromgif($input);
imagealphablending( $base, false );
imagesavealpha( $base, true );
return $base;
break;
case 'image/vnd.wap.wbmp':
$base = imagecreatefromwbmp($input);
imagealphablending( $base, false );
imagesavealpha( $base, true );
return $base;
break;
case '': default: return false; break;
}
}
return false;
}
这会将图像输出到水印,但不会接缝以实际为图像添加水印。
【问题讨论】:
标签: php