3

在为照片加水印时遇到一些初期问题。除了水印照片的颜色变得比应有的暗淡之外,这一切都很好 - 事实上非常明显。

我正在使用imagecopyresized来添加水印,因为这特别允许我使用 PNG-24 水印,而其他水印则不能。我知道颜色通常没问题,因为我刚刚使用readfile($url)作为测试,而且照片很完美。

这是我的脚本:

<?php

// get parent and watermark images & sizes
$image = imagecreatefromjpeg($url);
$imageSize = getimagesize($url);
$watermark = imagecreatefrompng('watermark.png');
$watermark_o_width = imagesx($watermark);
$watermark_o_height = imagesy($watermark);

// calculate new watermark width and position
if ($imageSize[0] > $imageSize[1] || $imageSize[0] == $imageSize[1]) {
    $leftPercent = 23;
} else {
    $leftPercent = 7;
}
$leftPixels = ($imageSize[0]/100)*$leftPercent;
$newWatermarkWidth = $imageSize[0]-$leftPixels;
$newWatermarkHeight = $watermark_o_height * ($newWatermarkWidth / $watermark_o_width);

// place watermark on parent image, centered and scaled
imagecopyresized(
    $image,
    $watermark,
    $imageSize[0]/2 - $newWatermarkWidth/2,
    $imageSize[1]/2 - $newWatermarkHeight/2,
    0,
    0,
    $newWatermarkWidth,
    $newWatermarkHeight,
    imagesx($watermark),
    imagesy($watermark)
);

// print
imagejpeg($image);

// destroy
imagedestroy($image);
imagedestroy($watermark);

?>

我怎样才能阻止这种情况发生?我正在阅读有关imagecreatetruecolor的内容,这能解决问题吗?我在谷歌上搜索“imagecreatetruecolor color loss photos”和变体,但没有人真正谈论这个问题。如果我确实需要这个功能,我会在哪里将它添加到这个脚本中?

这对我来说完全是一把扳手,希望有人告诉我把它粘在哪里(不是字面意思)。

这是一个颜色损失的例子。预览图像应与缩略图的颜色完全相同。缩略图是使用readfile()创建的,而预览是使用imagecreatefromjpegimagecopresized创建的。

在此处输入图像描述

4

2 回答 2

2

通过使用与图像相同的特征,此示例代码可以正常工作:

原始JPG:深色背景;美丽的女孩; 红色礼服。水印PNG:透明背景;文本; 灰色。

<?php

// Path the the requested file (clean up the value if needed)
$path = $url;

// Load image
$image = imagecreatefromjpeg($path);
$w = imagesx($image);
$h = imagesy($image);

// Load watermark
$watermark = imagecreatefrompng('watermark.png');
$ww = imagesx($watermark);
$wh = imagesy($watermark);

// Merge watermark upon the original image (center center)
imagecopy($image, $watermark, (($w/2)-($ww/2)), (($h/2)-($wh/2)), 0, 0, $ww, $wh);

// Output the image to the browser
header('Content-type: image/jpeg');
imagejpeg($image);

// destroy both images
imagedestroy($image);
imagedestroy($watermark);

// kill script
exit();

?>


左:输出图像 | 右:原始图像

截屏

笔记:

输出图像被压缩多次,直到:Original -> PHP Output -> GIMP -> Here

于 2012-07-29T05:51:00.993 回答
0

经过多次测试,我得出的结论是 PHP 的 GD Image 不支持在被加水印的图像上的颜色配置文件。我现在正在使用 Imagick,颜色很完美。

于 2012-08-06T00:48:44.977 回答