php resize image zoomcrop without border (logic)
i have a image manipulation class, i want to create images that always fill the entire new width and height so the开发者_StackOverflow中文版re are no borders/solid color background, i just cant understand how i can make it always fill the height and width (mantaining the aspect ratio of the uploaded image) if the image width AND height are smaller than the new image size..
just like the zoomcrop (zc=1) from phpthumb class (i looked the code from it but i couldnt mimic the behavior)
public function resizeCrop($newwidth, $newheight) {
...
$x = $this->getX();
$y = $this->getY();
...
else if ($x < $newwidth && $y < $newheight)
{
// logic ??
}
}
You need to make sure that the smaller (relative to the aspect ratio of the original image and that of container) side is zoomed to maximum. Have a look at this code:
public function resizeCrop($newwidth, $newheight) {
...
$x = $this->getX();
$y = $this->getY();
// old images width will fit
if(($x / $y) < ($newwidth/$newheight)){
$scale = $newwidth/$x;
$newX = 0;
$newY = - ($scale * $y - $newheight) / 2;
// else old image's height will fit
}else{
$scale = $newheight/$y;
$newX = - ($scale * $x - $newwidth) / 2;
$newY = 0;
}
// new image
$dest = imagecreatetruecolor($newwidth, $newheight);
// now use imagecopyresampled
imagecopyresampled($dest, $src, $newX, $newY, 0, 0, $scale * $x, $scale * $y, $x, $y);
return $dest;
}
Update: Corrected the function. It is now working perfectly, I have tested it on my dev machine.
To maintain aspect ratio, you need to choose: either make the image too big and then crop the original, or you make it fit just right and then fill in the parts that don't reach the edges with a solid color.
The former, you can compare the percentage change for width and height respectively, then use the larger percentage as a multiplier against both dimensions. For a 1 x 1 unit image that you want to fit into a 2w x 3h unit area and maintain aspect ratio: you can use a 3x multiplier, get a 3 x 3 unit image, and crop .5 units left/right.
The latter, you use the smaller percentage as a multiplier. For a 1 x 1 unit image that you want to fit into a 2w x 3h unit area and maintain aspect ratio: you can use a 2x multiplier, get a 2 x 2 unit image, and add .5 units of solid color top/bottom.
精彩评论