Мои размеры фотографий различаются: они либо ландшафтные, портретные, либо квадратные, и мне нужно сделать водяной знак наилучшим образом подходящим для каждой фотографии – поэтому мне нужно изменить размер ширины водяного знака (без Imagick), так как это длинная прямоугольная форма , поэтому высота не имеет значения.
Я нашел функцию PHP, imagecopyresized
, но я буду честен, я не могу определить, какие параметры необходимы для моей ситуации, даже после просмотра документации PHP! Я также не уверен, что после использования imagecopyresized остальная часть моей функции будет работать там, где она получит ширину и высоту водяного знака.
Может кто-нибудь помочь мне преодолеть финишную черту. Именно так я и получил, все, что ему нужно – это правильные параметры, добавленные в imagecopyresized
part:
<?php header('content-type: image/jpeg'); $image = imagecreatefromjpeg('https://.....jpg'); $imageSize = getimagesize('https://.....jpg'); $newWatermarkWidth = $imageSize[0]-50; // width of image minus 50px $watermark = imagecreatefrompng('watermark.png'); // resize watermark to newWatermarkWidth here with imagecopyresize $watermark = imagecopyresized(?,?,?,?); $watermark_width = imagesx($watermark); $watermark_height = imagesy($watermark); $dest_x = ($imageSize[0]/2) - ($watermark_width/2) ; $dest_y = ($imageSize[1]/2) - ($watermark_height/2); imagecopy($image, $watermark, round($dest_x,0), round($dest_y,0), 0, 0, $watermark_width, $watermark_height); imagejpeg($image); imagedestroy($image); imagedestroy($watermark); ?>
ЭТО ЧТО Я ЗАВЕРШЕНО И РАБОТАЕТ СОВЕРШЕННО
Сценарий, который регулирует ширину водяного знака, чтобы он соответствовал всем родительским изображениям, центрированным и пропорциональным.
<?php header('content-type: image/jpeg'); $image = imagecreatefromjpeg('http://img.ruphp.com/watermark/myPhoto.jpg'); $imageSize = getimagesize('http://img.ruphp.com/watermark/myPhoto.jpg'); $watermark = imagecreatefrompng('http://img.ruphp.com/watermark/myWatermark.png'); $watermark_o_width = imagesx($watermark); $watermark_o_height = imagesy($watermark); $newWatermarkWidth = $imageSize[0]-20; $newWatermarkHeight = $watermark_o_height * $newWatermarkWidth / $watermark_o_width; imagecopyresized($image, $watermark, $imageSize[0]/2 - $newWatermarkWidth/2, $imageSize[1]/2 - $newWatermarkHeight/2, 0, 0, $newWatermarkWidth, $newWatermarkHeight, imagesx($watermark), imagesy($watermark)); imagejpeg($image); imagedestroy($image); imagedestroy($watermark);
Это изменяет размер водяного знака и копирует его непосредственно на изображение.
Вам больше не нужна существующая линейка imagecopy.
$success = imagecopyresized($image, // Destination image $watermark, // Source image $imageSize[0]/2 - $newWatermarkWidth/2, // Destination X $imageSize[1]/2 - imagesy($watermark)/2, // Destination Y 0, // Source X 0, // Source Y $newWatermarkWidth, // Destination W imagesy($watermark), // Destination H imagesx($watermark), // Source W imagesy($watermark)); // Source H