안녕 나는이 스크립트는 잘 작동 워터 마크 코드 http://koivi.com/php-gd-image-watermark/어떻게 워터 마크 이미지 크기
을 통합하고에 따라 PHP에서 파일을 자릅니다. 그러나 배경에 사용자 업로드 이미지가있는 포스터를 만들고 있습니다. 출력에 약간의 조정이 필요합니다. 워터 마크 디렉토리에 하나의 이미지 만 있습니다.
내 워터 마크 이미지는 500 픽셀 * 725px입니다. 따라서 워터 마크 이미지 크기에 따라 출력물을 잘라야합니다. 생성 된 현재 출력은 사용자가 업로드 한 이미지 크기 비율에 따릅니다. 여기
코드입니다 :<?php
/*
KOIVI GD Image Watermarker for PHP Copyright (C) 2004 Justin Koivisto
Version 2.0
Last Modified: 12/9/2004
*/
ob_start();
$disp_width_max=150; // used when displaying watermark choices
$disp_height_max=80; // used when displaying watermark choices
$edgePadding=15; // used when placing the watermark near an edge
$quality=100; // used when generating the final image
$default_watermark='Sample-trans.png'; // the default image to use if no watermark was chosen
if(isset($_POST['process'])){
// an image has been posted, let's get to the nitty-gritty
if(isset($_FILES['watermarkee']) && $_FILES['watermarkee']['error']==0){
// be sure that the other options we need have some kind of value
if(!isset($_POST['save_as'])) $_POST['save_as']='jpeg';
if(!isset($_POST['v_position'])) $_POST['v_position']='center';
if(!isset($_POST['h_position'])) $_POST['h_position']='center';
if(!isset($_POST['wm_size'])) $_POST['wm_size']='1';
if(!isset($_POST['watermark'])) $_POST['']=$default_watermark;
// file upload success
$size=getimagesize($_FILES['watermarkee']['tmp_name']);
if($size[2]==2 || $size[2]==3){
// it was a JPEG or PNG image, so we're OK so far
$original=$_FILES['watermarkee']['tmp_name'];
$target_name=date('YmdHis').'_'.
// if you change this regex, be sure to change it in generated-images.php:26
preg_replace('`[^a-z0-9-_.]`i','',$_FILES['watermarkee']['name']);
$target=dirname(__FILE__).'/results/'.$target_name;
$watermark=dirname(__FILE__).'/watermarks/'.$_POST['watermark'];
$wmTarget=$watermark.'.tmp';
$origInfo = getimagesize($original);
$origWidth = $origInfo[0];
$origHeight = $origInfo[1];
$waterMarkInfo = getimagesize($watermark);
$waterMarkWidth = $waterMarkInfo[0];
$waterMarkHeight = $waterMarkInfo[1];
// watermark sizing info
if($_POST['wm_size']=='larger'){
$placementX=0;
$placementY=0;
$_POST['h_position']='center';
$_POST['v_position']='center';
$waterMarkDestWidth=$waterMarkWidth;
$waterMarkDestHeight=$waterMarkHeight;
// both of the watermark dimensions need to be 5% more than the original image...
// adjust width first.
if($waterMarkWidth > $origWidth*1.05 && $waterMarkHeight > $origHeight*1.05){
// both are already larger than the original by at least 5%...
// we need to make the watermark *smaller* for this one.
// where is the largest difference?
$wdiff=$waterMarkDestWidth - $origWidth;
$hdiff=$waterMarkDestHeight - $origHeight;
if($wdiff > $hdiff){
// the width has the largest difference - get percentage
$sizer=($wdiff/$waterMarkDestWidth)-0.05;
}else{
$sizer=($hdiff/$waterMarkDestHeight)-0.05;
}
$waterMarkDestWidth-=$waterMarkDestWidth * $sizer;
$waterMarkDestHeight-=$waterMarkDestHeight * $sizer;
}else{
// the watermark will need to be enlarged for this one
// where is the largest difference?
$wdiff=$origWidth - $waterMarkDestWidth;
$hdiff=$origHeight - $waterMarkDestHeight;
if($wdiff > $hdiff){
// the width has the largest difference - get percentage
$sizer=($wdiff/$waterMarkDestWidth)+0.05;
}else{
$sizer=($hdiff/$waterMarkDestHeight)+0.05;
}
$waterMarkDestWidth+=$waterMarkDestWidth * $sizer;
$waterMarkDestHeight+=$waterMarkDestHeight * $sizer;
}
}else{
$waterMarkDestWidth=round($origWidth * floatval($_POST['wm_size']));
$waterMarkDestHeight=round($origHeight * floatval($_POST['wm_size']));
if($_POST['wm_size']==1){
$waterMarkDestWidth-=2*$edgePadding;
$waterMarkDestHeight-=2*$edgePadding;
}
}
// OK, we have what size we want the watermark to be, time to scale the watermark image
resize_png_image($watermark,$waterMarkDestWidth,$waterMarkDestHeight,$wmTarget);
// get the size info for this watermark.
$wmInfo=getimagesize($wmTarget);
$waterMarkDestWidth=$wmInfo[0];
$waterMarkDestHeight=$wmInfo[1];
$differenceX = $origWidth - $waterMarkDestWidth;
$differenceY = $origHeight - $waterMarkDestHeight;
// where to place the watermark?
switch($_POST['h_position']){
// find the X coord for placement
case 'left':
$placementX = $edgePadding;
break;
case 'center':
$placementX = round($differenceX/2);
break;
case 'right':
$placementX = $origWidth - $waterMarkDestWidth - $edgePadding;
break;
}
switch($_POST['v_position']){
// find the Y coord for placement
case 'top':
$placementY = $edgePadding;
break;
case 'center':
$placementY = round($differenceY/2);
break;
case 'bottom':
$placementY = $origHeight - $waterMarkDestHeight - $edgePadding;
break;
}
if($size[2]==3)
$resultImage = imagecreatefrompng($original);
else
$resultImage = imagecreatefromjpeg($original);
imagealphablending($resultImage, TRUE);
$finalWaterMarkImage = imagecreatefrompng($wmTarget);
$finalWaterMarkWidth = imagesx($finalWaterMarkImage);
$finalWaterMarkHeight = imagesy($finalWaterMarkImage);
imagecopy($resultImage,
$finalWaterMarkImage,
$placementX,
$placementY,
0,
0,
$finalWaterMarkWidth,
$finalWaterMarkHeight
);
if($size[2]==3){
imagealphablending($resultImage,FALSE);
imagesavealpha($resultImage,TRUE);
imagepng($resultImage,$target,$quality);
}else{
imagejpeg($resultImage,$target,$quality);
}
imagedestroy($resultImage);
imagedestroy($finalWaterMarkImage);
// display resulting image for download
?>
<div>
<h1>Watermarked Image</h1>
<p>
<a href="<?php echo $_SERVER['PHP_SELF'] ?>">Back To Form</a> <a href="generated-images.php">View Previously Watermarked Images</a>
<a href="/php-gd-image-watermark.zip">Source Code Download</a>
</p>
<p>
Below is the resulting watermarked image based on your input on the submission form. To save the image, right-click
(control click on a Mac) and select the option similar to "Save Image As..." You can then save the image to your harddrive
when prompted for a save location.
</p>
<p>
Watermarked images are also saved on this system. You can view and/or delete watermarked images
<a href="generated-images.php">here</a>.
</p>
<p align="center">
<img src="results/<?php echo $target_name ?>?id=<?php echo md5(time()) ?>" alt="" />
</p>
<hr>
</div>
<?php
unlink($wmTarget);
}else{
?>
<div>
<h1>Watermarked Image</h1>
<p class="errorMsg">The image uploaded was not a JPEG or PNG image.</p>
</div>
<?php
}
}else{
?>
<div>
<h1>Watermarked Image</h1>
<p class="errorMsg">Unable to upload the image to watermark.</p>
</div>
<?php
}
}else{
// no image posted, show form for options
?>
<div>
<h1>Watermark A JPEG or PNG Image</h1>
<p>
<a href="generated-images.php">View Previously Watermarked Images</a>
<a href="/php-gd-image-watermark.zip">Source Code Download</a>
</p>
<p>
If you are uploading a PNG-24 image that has alpha transparency and are saving it as a PNG,
the transparency will be saved with the watermarked version of the image. However, if the original
image is a PNG-8 with transparency, you may get unexpected results.
</p>
<form method="post" enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF'] ?>">
<table cellpadding="2" cellspacing="0" border="0">
<tr>
<th width="50%">
Image to WaterMark:
<p>(72dpi, RGB JPEG/PNG)</p>
</th>
<td width="50%">
<input type="file" name="watermarkee" />
</td>
</tr>
<tr>
<th valign="top">
Choose Watermark:<br />
<p>
Watermark images are located in the "watermarks" subdirectory. All images are PNG-24 with alpha
transparency. These images were created using Adobe Photoshop® by setting the image's opacity to 30% and
using the "Save For Web" option to save the file.
</p>
<p>
The watermark images shown are not displayed at their true size, they are actually quite a bit larger so that
the quality of the watermark will not deteriorate as quickly when watermarking larger images.
</p>
</th>
<td valign="top">
<table cellpadding="2" cellspacing="0" border="0">
<?php
$dir=dirname(__FILE__).'/watermarks';
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
$i=0;
$watermarks=array();
while (($file = readdir($dh)) !== FALSE) {
if(!preg_match('`\.png$`',$file)) continue;
$watermarks[]=$file;
}
closedir($dh);
// now sort the array according to file name
asort($watermarks);
foreach($watermarks as $file){
// restrain display width
$size=getimagesize($dir.'/'.$file);
if($size[0] > $disp_width_max && $disp_width_max){
$reduction=$disp_width_max/$size[0];
$size[0]=$size[0]*$reduction;
$size[1]=$size[1]*$reduction;
$size[3]=sprintf('width="%d" height="%d"',$size[0],$size[1]);
// also restrain the height after a resize
if($size[1] > $disp_height_max && $disp_height_max){
$reduction=$disp_height_max/$size[1];
$size[0]=$size[0]*$reduction;
$size[1]=$size[1]*$reduction;
$size[3]=sprintf('width="%d" height="%d"',$size[0],$size[1]);
}
}
// also restrain the height
if($size[1] > $disp_height_max && $disp_height_max){
$reduction=$disp_height_max/$size[1];
$size[0]=$size[0]*$reduction;
$size[1]=$size[1]*$reduction;
$size[3]=sprintf('width="%d" height="%d"',$size[0],$size[1]);
}
echo ' <tr>',"\n",
' <td>',"\n",
' <input type="radio" value="',$file,'" name="watermark" /> ',
'<img src="watermarks/',$file,'" ',$size[3],' alt="" />',"\n",
' </td>',"\n",
' </tr>',"\n";
$i++;
}
if($i==0){
// no images at this time
echo ' <tr>',"\n",
' <td>',"\n",
' There are currently no watermark images to use with this the system on this server.',"\n",
' </td>',"\n",
' </tr>',"\n";
}
}
}
?>
</table>
</td>
</tr>
<tr>
<th valign="top">
Watermark Position:
<p>(Horizontal)</p>
</th>
<td>
<input type="radio" name="h_position" value="left" /> Left<br />
<input type="radio" name="h_position" value="center" /> Center<br />
<input type="radio" name="h_position" value="right" /> Right<br />
</td>
</tr>
<tr>
<th valign="top">
Watermark Position:
<p>(Vertical)</p>
</th>
<td>
<input type="radio" name="v_position" value="top" /> Top<br />
<input type="radio" name="v_position" value="center" /> Center<br />
<input type="radio" name="v_position" value="bottom" /> Bottom<br />
</td>
</tr>
<tr>
<th valign="top">
Watermark Coverage:
<p>(Size of Originial)</p>
</th>
<td>
<input type="radio" name="wm_size" value="larger" /> Cover Entire Image<br />
<input type="radio" name="wm_size" value="1" /> 100% (Shows entire watermark)<br />
<input type="radio" name="wm_size" value=".5" /> 50%<br />
</td>
</tr>
<tr>
<td align="center" colspan="2">
<input type="submit" name="process" value="Watermark Image" />
</td>
</tr>
</table>
</form>
</div>
<?php
}
$page_display=ob_get_clean();
function resize_png_image($img,$newWidth,$newHeight,$target){
$srcImage=imagecreatefrompng($img);
if($srcImage==''){
return FALSE;
}
$srcWidth=imagesx($srcImage);
$srcHeight=imagesy($srcImage);
$percentage=(double)$newWidth/$srcWidth;
$destHeight=round($srcHeight*$percentage)+1;
$destWidth=round($srcWidth*$percentage)+1;
if($destHeight > $newHeight){
// if the width produces a height bigger than we want, calculate based on height
$percentage=(double)$newHeight/$srcHeight;
$destHeight=round($srcHeight*$percentage)+1;
$destWidth=round($srcWidth*$percentage)+1;
}
$destImage=imagecreatetruecolor($destWidth-1,$destHeight-1);
if(!imagealphablending($destImage,FALSE)){
return FALSE;
}
if(!imagesavealpha($destImage,TRUE)){
return FALSE;
}
if(!imagecopyresampled($destImage,$srcImage,0,0,0,0,$destWidth,$destHeight,$srcWidth,$srcHeight)){
return FALSE;
}
if(!imagepng($destImage,$target)){
return FALSE;
}
imagedestroy($destImage);
imagedestroy($srcImage);
return TRUE;
}
echo '<?xml version="1.0" encoding="iso-8859-1"?>',"\n";
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Watermarking JPEG and PNG Images with PHP and GD2</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta name="description" content="A PHP implementation to watermark JPEG or PNG images with a PNG-24 image with alpha transparency." />
<style type="text/css">
@import url(http://koivi.com/styles.css);
th{
text-align: right;
font-weight: bold;
}
th p{
font-weight: normal;
font-size: 75%;
color: #c00;
background-color: transparent;
}
</style>
<!--[if lt IE 7]><script src="/ie7/ie7-standard.js" type="text/javascript"></script><![endif]-->
</head>
<body>
<div id="container">
<div id="intro">
<h1>Watermarking PNG and JPEG Images with PHP and GD2</h1>
<p>
Have you ever wanted to add a transparent watermark to an image that you post on your website?
If so, then this may be exactly what you are looking for!
</p>
<p>
Choose the image to watermark, the watermark you want to use (pulled from a directory of images),
how you want it positioned on the resulting image and its size. Watermarked images are stored on
the server so you can use them later. Management screen also lets you delete a watermarked image
from the server to reduce clutter.
</p>
<p>
A <big>BIG</big> "Thank-you" goes out to J Wynia for his excellent article entitled
"<a href="http://www.phpgeek.com/articles.php?content_id=6">Watermarking Photos with PHP/GD2</a>"
from June 3, 2003 that covers the basics that were used to get this system together!
</p>
</div>
<div>
<?php echo $page_display ?>
</div>
</div>
</body>
</html>
내가 워터 마크 이미지의 크기 비율에 따라 croped 이미지를 얻기 위해 변경해야
? 도와주세요.
코드는 꽤 길다! 관련 부품으로 줄이십시오. – codeling
Google에서 'php gd image crop'을 사용할 수 있습니다. 당신은 튜토리얼 톤에 홍수 것입니다. –