我正在尝试实现用于调整图像大小的API。它不是完全用于图像处理,这只是API的一个部分/特征。
我想要实施的内容。
我有用于从服务器检索图像的网址,它看起来像
mywebpage.com/api/product/42/image
此网址会将网址返回到ID为42的产品的完整图片
一切都好。
我们可以使用像这样的GET参数指定所需的大小
mywebpage.com/api/product/42/image?width=200&height=300
看起来也不错
但我的问题是否跟随。
由于我们可以在具有不同尺寸和纵横比的服务器上拥有不同的图像,因此我需要在调整大小时保持这个比例。
例如,我需要图像以适应200x300容器,但我在服务器上有1024x576(16:9)图像。我需要调整此图像的大小,但保持初始宽高比(16:9),但要适合所需的容器。
如何根据传入的所需尺寸和当前图像宽高比有效地计算要返回的新图像尺寸。
我想提前感谢所有人的帮助或建议。
答案 0 :(得分:0)
如果您需要始终适合200x300的容器(或者通过URL传递的容器),您可能不会因为您知道它会影响图像宽高比而能够简单地调整它的大小。
如果是这种情况,您可以做的是将图像调整到最接近的尺寸,然后裁剪图像的其余部分。
我假设您将使用imagemagick。你看过文件了吗? cropThumbnailImage方法执行我刚才解释的内容。
使用示例:
/* Read the image */
$im = new imagick( "test.png" );
/* create the thumbnail */
$im->cropThumbnailImage( 80, 80 );
/* Write to a file */
$im->writeImage( "th_80x80_test.png" );
答案 1 :(得分:0)
这是我用来做类似事情的脚本。很旧,所以可能不是最新的。
<?php
if( isset($_GET["width"]) && is_numeric($_GET["width"]))
$target_width = intval($_GET["width"]);
else
$target_width= 200;//default value
if( isset($_GET["height"]) && is_numeric($_GET["height"]))
$target_height = intval($_GET["width"]);
else
$target_height= 300;//default value
if( isset($_GET["id"]) && is_numeric($_GET["id"]))//prevent any unwanted filesystem access
$original_image_path = "img/products/$id.jpg";
else
$original_image_path = "placeholder.png"
//http://php.net/manual/fr/function.getimagesize.php
$image_size = getimagesize($original_image_path);
//get the ratio of the original image
$image_ratio= $image_size[1]/ $image_size[0];
$original_image = imagecreatefromjpeg($original_image_path);
$new_image = imagecreatetruecolor($target_width, $image_ratio * $target_width);
//paints the image in white
//http://php.net/manual/en/function.imagefill.php
//http://php.net/manual/en/function.imagecolorallocatealpha.php
imagefill( $new_image, 0, 0, imagecolorallocatealpha($new_image, 255,255,255,127) );
imagesavealpha($new_image, TRUE);
/*
Copies the original to the new, preserving the ratio.
The original image fills all the width of the new,
and is placed on the top of the new.
http://php.net/manual/en/function.imagecopyresized.php
*/
imagecopyresized(
$new_image,$original_image,
0,0,
0,0,
$target_width,$image_ratio * $target_width,
$image_size[0],$image_size[1]
);
//image is returned in response to the request
header ("Content-type: image/png");
imagepng( $new_image );
?>