我们也被用户抱怨了( http://17salsa.net )
以为是 GD 库的水印叠加算法问题,于是换了 ImageMagick,修改附后。
可是更换为 ImageMagic 后发现同样有图片质量下降严重的问题。
(即便是把质量提高到 92,缺省是72)
希望官方能够尽快给一个解决方案,否则水印功能对用户照片影响太严重了。
使用ImageMagick的代码(也许有办法能让他提高质量?)
在 /home/source/function_image.php 中的 121 行 makewatermark($srcfile) 函数中:
最开始处增加判断:
if ( function_exists('NewMagickWand') )
{
makewatermark_imagemagic($srcfile);
// error_log("makewaatermark TESTING");
return;
}
然后在文件最末尾增加新函数 makewatermark_imagemagic($srcfile) :
function makewatermark_imagemagic($srcfile) {
global $_SGLOBAL;
include_once(S_ROOT.'./data/data_setting.php');
//??¨®?¨ª???
$watermarkfile = empty($_SGLOBAL['setting']['watermarkfile'])?S_ROOT.'./image/watermark.png' _SGLOBAL['setting']['watermarkfile'];
if(!file_exists($watermarkfile) || !$water_info = getimagesize($watermarkfile)) {
return '';
}
$water_w = $water_info[0];
$water_h = $water_info[1];
$water_im = NewMagickWand();
@MagickReadImage($water_im, $watermarkfile);
if(empty($water_im)) {
return '';
}
//?-¨ª?
if(!file_exists($srcfile) || !$src_info = getimagesize($srcfile)) {
return '';
}
$src_w = $src_info[0];
$src_h = $src_info[1];¡Á¨®
$src_im = NewMagickWand();
switch($src_info[2]) {
case 1:
//?D??¨º?¡¤??a?¡¥?-
$fp = fopen($srcfile, 'rb');
$filecontent = fread($fp, filesize($srcfile));
fclose($fp);
if(strpos($filecontent, 'NETSCAPE2.0') === FALSE) {//?¡¥?-¨ª?2??¨®??¨®?
@MagickReadImage($src_im, $srcfile);
}
break;
default:
@MagickReadImage($src_im, $srcfile);
break;
}
if(empty($src_im)) {¨º???t
return '';
}
//?¨®??¨®?¦Ì?¨ª???¦Ì?3¡è?¨¨?¨°?¨ª?¨¨¡À¨¨??¨®?D?150px
if(($src_w < $water_w + 150) || ($src_h < $water_h + 150)) {
return '';
}
//????
switch($_SGLOBAL['setting']['watermarkpos']) {
case 1://?£¤???¨®¡Á¨®
$posx = 0;
$posy = 0;
break;
case 2://?£¤???¨®¨®¨°
$posx = $src_w - $water_w;
$posy = 0;
break;
case 3://¦Ì¡Á???¨®¡Á¨®
$posx = 0;
$posy = $src_h - $water_h;
break;
case 4://¦Ì¡Á???¨®¨®¨°
$posx = $src_w - $water_w;
$posy = $src_h - $water_h;
break;
default://???¨²
$posx = mt_rand(0, ($src_w - $water_w));
$posy = mt_rand(0, ($src_h - $water_h));
break;
}
@MagickCompositeImage($src_im, $water_im, MW_AtopCompositeOp, $posx, $posy );
MagickSetImageCompressionQuality($src_im, 92);
if( !MagickWriteImage($src_im, $srcfile) )
{
error_log("MagickWriteImage failed!");
}
DestroyMagickWand($src_im);
DestroyMagickWand($water_im);
}
|