image — Рассчитать ближайшее возможное значение размера PHP (с учетом соотношения)

Я пытаюсь реализовать API для изменения размера изображения. Он создан не совсем для обработки изображений, это только одна часть / особенность API.

Что я хочу реализовать.

У меня есть URL для получения изображения с сервера это выглядит

 mywebpage.com/api/product/42/image

Этот URL вернет URL к полному изображению продукта с идентификатором 42.
Все отлично.
Мы можем указать желаемый размер с помощью параметров GET, как это

 mywebpage.com/api/product/42/image?width=200&height=300

Это также выглядит хорошо

Но мой вопрос, если следовать.
Поскольку у нас могут быть разные изображения на сервере с разным размером и соотношением сторон, мне нужно сохранять это соотношение при изменении размера.

Например, мне нужно изображение, чтобы поместиться в контейнер 200×300, но у меня есть изображение 1024×576 (16: 9) на сервере. Мне нужно изменить размер этого изображения, но сохранить исходное соотношение сторон (16: 9), но чтобы он соответствовал желаемому контейнеру.

Как я могу эффективно рассчитать новый размер изображения для возврата в зависимости от входящего желаемого размера и текущего соотношения сторон изображения.

Я хочу заранее поблагодарить всех за любую помощь или советы.

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 );

?>
0

Другие решения

Ну, если вам нужно всегда помещать контейнер размером 200×300 (или что-либо, что передается через 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" );

http://php.net/manual/en/imagick.cropthumbnailimage.php

0

По вопросам рекламы [email protected]