下面这段代码可以实现自动识别图片的色阶,更加色阶差来添加图片的水印,这样可以避免水印和图片色阶一样的弊端.
<?php
function add_wm($nmw_water, $src_file, $output_file, $x, $y) {
if(file_exists($output_file))
return
$w1 = MagickGetImageWidth($nmw_water)
$h1 = MagickGetImageHeight($nmw_water)
$nmw =NewMagickWand()
MagickReadImage($nmw, $src_file)
// 默认的加水印位置调整
$lt_w = 50
$lt_h = 50
if($x == 0){
$w = MagickGetImageWidth($nmw)
$h = MagickGetImageHeight($nmw)
$x = $w
$y = $h
}else{
// 根据具体情况调整
$lt_w = 30
$lt_h = 40
}
MagickCompositeImage($nmw, $nmw_water, MW_OverCompositeOp, $x - $w1 - $lt_w, $y - $h1 - $lt_h)
MagickWriteImage($nmw, $output_file)
DestroyMagickWand($nmw)
}
// 还是groovy的eachFileRecurse好用啊
function add_wm_recurse($nmw_water, $to_dir, $output_dir, $arr) {
$dp = dir($to_dir)
while($file=$dp->read()){
if($file != '.' &&$file != '..'){
if(is_dir($to_dir . '/' . $file)){
mkdir($output_dir . '/' . $file)
add_wm_recurse($nmw_water, $to_dir . '/' . $file, $output_dir . '/' . $file, $arr)
}else{
if(!array_key_exists($to_dir . '/' . $file, $arr)){
continue
}
$sub_arr = $arr[$to_dir . '/' . $file]
if($sub_arr){
$x = intval($sub_arr[0])
$y = intval($sub_arr[1])
add_wm($nmw_water, $to_dir . '/' . $file, $output_dir . '/' . $file, $x, $y)
}
}
}
}
$dp->close()
}
$to_dir = './resized'
$output_dir = './output'
// 这个是我用java的ImageIO遍历图片像素获取的符合裤子颜色的区域的坐标array(posX, posY)
$arr = array(
array(50, 50)
)
$water = './water.png'
$nmw_water =NewMagickWand()
MagickReadImage($nmw_water, $water)
add_wm_recurse($nmw_water, $to_dir, $output_dir, $arr)
DestroyMagickWand($nmw_water)
?>
补充:
PHP图像处理模块 MagickWand用法
MagickWand 是一个PHP的模块,用来访问 ImageMagick 的图像处理库。下面是一个使用 MagicWand 的代码片段:
$magick_wand=NewMagickWand()
MagickReadImage($magick_wand,'rose.jpg')
$drawing_wand=NewDrawingWand()
DrawSetFont($drawing_wand,"/usr/share/fonts/bitstream-vera/Vera.ttf")
DrawSetFontSize($drawing_wand,20)
DrawSetGravity($drawing_wand,MW_CenterGravity)
$pixel_wand=NewPixelWand()
PixelSetColor($pixel_wand,"white")
DrawSetFillColor($drawing_wand,$pixel_wand)
if (MagickAnnotateImage($magick_wand,$drawing_wand,0,0,0,"Rose") != 0)
{
MagickEchoImageBlob( $magick_wand )
}
else
{
echo MagickGetExceptionString($magick_wand)
}
?>
安装方法:
1. 下载 php_magickwand_q16_st.dll for 5.2.x
2. 将其放在PHP的扩展目录
3. 在php.ini文件总增加 extension=php_magickwand_q16_st.dll
4. 重新启动apache
我知道的有三种,都是使用GD库的image函数一种是直接在图片上写文字
imagefttext()
一种是带透明度的水印图片
imagecopy()
还有一种是可以自定义水印图片透明度的
imagecopymerge()
你想要什么效果,可以接着细说
//批量处理图片、图片生成缩略图、图片添加水印$dir = opendir (dirname(__FILE__))
while (!!$_file = readdir($dir)){
list($filesname,$kzm)=explode(".",$_file)//获取扩展名
if($kzm=="gif" or $kzm=="jpg" or $kzm=="JPG" or $kzm=="png") {
if(!makethumb("$_file","120","120","100")){
echo '执行成功!'
}else{
echo '执行失败!'
}
}
}
closedir($dir)
/**
* 处理缩略图并添加水印函数
* @access publiuc
* @param $srcFile-----------图片文件名
* @param $dstFile-----------另存的文件名
* @param $dstW-------------图片保存的宽度
* @param $dstH--------------图片保存的高度
* @param $rate---------------图片保存的品质
* @param $markwords-----水印文字
* @param $markimage-----水印图片
* @param 使用方法 makethumb("a.jpg","b.jpg","120","120","100")
*/
function makethumb($srcFile/*,$dstFile*/,$dstW,$dstH,$rate=100/*,$markwords=null,$markimage=null*/) {
$data = GetImageSize($srcFile)
switch($data[2]) {
case 1:
$im=@ImageCreateFromGIF($srcFile)
break
case 2:
$im=@ImageCreateFromJPEG($srcFile)
break
case 3:
$im=@ImageCreateFromPNG($srcFile)
break
}
if(!$im) return False
$srcW=ImageSX($im)
$srcH=ImageSY($im)
$dstX=0
$dstY=0
if ($srcW*$dstH>$srcH*$dstW) {
$fdstH = round($srcH*$dstW/$srcW)
$dstY = floor(($dstH-$fdstH)/2)
$fdstW = $dstW
}
else
{
$fdstW = round($srcW*$dstH/$srcH)
$dstX = floor(($dstW-$fdstW)/2)
$fdstH = $dstH
}
$ni=ImageCreateTrueColor($dstW,$dstH)
$dstX=($dstX<0)?0:$dstX
$dstY=($dstX<0)?0:$dstY
$dstX=($dstX>($dstW/2))?floor($dstW/2):$dstX
$dstY=($dstY>($dstH/2))?floor($dstH/s):$dstY
$white = ImageColorAllocate($ni,255,255,255)
$black = ImageColorAllocate($ni,0,0,0)
imagefilledrectangle($ni,0,0,$dstW,$dstH,$white)// 填充背景色
ImageCopyResized($ni,$im,$dstX,$dstY,0,0,$fdstW,$fdstH,$srcW,$srcH)
//if($markwords!=null){
// $markwords=iconv("gb2312","UTF-8",$markwords)
// //转换文字编码
// ImageTTFText($ni,20,30,450,560,$black,"simhei.ttf",$markwords) //写入文字水印,参数依次为,文字大小|偏转度|横坐标|纵坐标|文字颜色|文字类型|文字内容
//}elseif($markimage!=null) {
// $wimage_data = GetImageSize($markimage)
// switch($wimage_data[2]) {
// case 1:
// $wimage=@ImageCreateFromGIF($markimage)
// break
// case 2:
// $wimage=@ImageCreateFromJPEG($markimage)
// break
// case 3:
// $wimage=@ImageCreateFromPNG($markimage)
// break
// }
// imagecopy($ni,$wimage,500,560,0,0,88,31) //写入图片水印,水印图片大小默认为88*31
// imagedestroy($wimage)
//}
$dstFile = $srcFile.'.gif'
ImageJpeg($ni,$dstFile,$rate)
//ImageJpeg($ni,$srcFile,$rate)
imagedestroy($im)
imagedestroy($ni)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)