PHP如何根据图片色阶不同添加水印

PHP如何根据图片色阶不同添加水印,第1张

在使用php编程的时候, 很多时候需要对上传的图片水印,来确定图片版权和出处. 但是,一般情况下加水印的位置是图片的右下角, 但是,不同图片的色阶不同,有时候我们 图片的水印和图片本身色阶相同,就会造成水印不明显.

下面这段代码可以实现自动识别图片的色阶,更加色阶差来添加图片的水印,这样可以避免水印和图片色阶一样的弊端.

<?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)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11919182.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存