Scaling a watermark to fit parent image

我的梦境 提交于 2020-01-01 03:38:05

问题


My photo sizes vary, they are either landscape, portrait or square, and I need to make a watermark the best fit for each photo - so I need to resize just the width of the watermark (without Imagick), as it's a long rectangle shape, so height doesn't matter.

I found the PHP function, imagecopyresized, but I'll be honest, I can't work out what parameters are needed for my situation, even after looking at PHP documentation! I'm also not sure if after using imagecopyresized, the rest of my function will work where it gets the watermark width and height.

Can somebody help me get over the finish line. This is how far I got, all it needs is the right parameters added to the 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);

?>

THIS IS WHAT I ENDED WITH & WORKS PERFECTLY

A script that adjusts the width of a watermark to fit across the whole parent image, centered and proportional.

<?php
header('content-type: image/jpeg');

$image = imagecreatefromjpeg('http://mydomain.com/myPhoto.jpg');
$imageSize = getimagesize('http://mydomain.com/myPhoto.jpg');

$watermark = imagecreatefrompng('http://mydomain.com/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);

回答1:


This resizes the watermark and copies directly to the image.

You don't need the existing imagecopy line anymore.

$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


来源:https://stackoverflow.com/questions/11693644/scaling-a-watermark-to-fit-parent-image

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!