Получить ширину и высоту уменьшенного изображения после фотографирования?

Продолжение этого вопроса:
Как получить новую ширину и высоту после поворота изображения с помощью imagerotate ()?

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

Как бы я этого достиг? Смотрите код ниже для моей попытки …

$ps['product_angle'] = 77; //Could be any angle
$filename = 'test.png'     //filename to the original product

list($source_width, $source_height) = getimagesize($filename);
$source_image = imagecreatefromjpeg($filename);

//Example for clarification (this is parameters that is used to save new image)
$ps['product_width'] = 40;      //for example $source_width = 200
$ps['product_height'] = 80;     //and $source_height = 400$angle = $ps['product_angle'];
if (intval($angle) <> 0) {

//Actual dimensions of image from filename
$current_source_x = imagesx($source_image);
$current_source_y = imagesy($source_image);

//Get current ratio of "scaled down image"$ratio_x = $ps['product_width'] / $current_source_x;
$ratio_y = $ps['product_height'] / $current_source_y;

$source_image = imagerotate(
$source_image,
360-$angle,
imageColorAllocateAlpha($source_image, 255, 255, 255, 127)
);

//New dimensions from actual filename
//This would be fine if I just wanted the new width and height
//based on the filenames dimension, but I want new dimensions
//for the "scaled downed version" of the image (40, 80)
$new_image_source_x = imagesx($source_image);
$new_image_source_y = imagesy($source_image);

//I tried this, but obviously I'm doing something totally wrong
$new_width = ($new_image_source_x - $current_source_x)  * $ratio_x;
$new_height = ($new_image_source_y - $current_source_y)  * $ratio_y;

//Set new width after rotation
$ps['product_width']  = $new_width;
$ps['product_height'] = $new_height;}

$ps['source_image'] = $source_image;
list($source_width, $source_height) =     getimagesize($filename);

$dest_width = (int)$ps['product_width'];
$dest_height = (int)$ps['product_height'];

//Resize source-image to new width and height
//
imagecopyresized($dest_image, $ps['source_image'], 0, 0, 0, 0, $dest_width, $dest_height, $source_width, $source_height);

Вероятно, я упускаю что-то очень важное ….

ОБНОВИТЬ

Пример реальных ценностей …

image current width63.224619257754
image current height80.210337864315

//after calculation
image new width37.583523669887
image newt height21.716336015666

where angle is 41.10419020401479

1

Решение

Смотря на мой комментарий

«Я действительно пришел к решению»

.. Это был не тот день, когда я использовал свои лучшие знания английского языка …

Я думаю, вы знаете, что я имел в виду, и вот как я решил свою проблему:

В моем подходе я пытался вычислить новые значения на основе соотношения из «уменьшенного изображения», а затем получить новые ширину и высоту на основе разницы от «уменьшенного изображения» и «изображения после поворота».

Что-то вроде этого:

  1. Установите соотношение / соотношение между «уменьшенным изображением» и исходным изображением.
  2. Делать актуальный поворот изображения
  3. Получите разницу между исходными размерами из повернутого изображения и умножьте их на коэффициент отношения, установленный до поворота изображения.
  4. Получите новые ширину и высоту на основе угла поворота

Это действительно не работает правильно (не удалось в step4). Я много раз искал ответы на вопросы, как рассчитать ширину и высоту после поворота изображения. Но эти ширина и высота не возвращали те же размеры, что GD-функции imagesx() а также imagesy() возвращается после поворота изображения. Я опробовал несколько расчетов с использованием sin() а также cos() для получения ширины и высоты, но все еще не получили точно такие же значения, как imagesx() а также imagesy(),

Это заставило меня задуматься … Что, если я изменю свой подход на:

  1. Установите соотношение / соотношение между «уменьшенным изображением» и исходным изображением.
  2. Делать актуальный поворот изображения
  3. Примените новые размеры на основе отношения, умноженного на imagesx() а также imagesy() — значения возвращаются после поворота

Новый код:

//Rotate resized image (if it should be)
$angle = $ps['product_angle'];
if (intval($angle) <> 0) {

//Get current dimensions from file
$current_source_x = imagesx($source_image);
$current_source_y = imagesy($source_image);

//Get current ratio of "scaled down image"$ratio_x = $ps['product_width'] / $current_source_x;
$ratio_y = $ps['product_height'] / $current_source_y;

//Rotate image
$source_image = imagerotate($source_image, 360-$angle, imageColorAllocateAlpha($source_image, 255, 255, 255, 127));

//Now we get a new width from the imagerotate()-function, use those to set new_width from
//ratio/propoprtions is used from origin width and height
$ps['product_width']  = imagesx($source_image) * $ratio_x;
$ps['product_height'] = imagesy($source_image) * $ratio_y;

}

Это работало нормально — почти … теперь проблема заключалась в том, что если бы новая ширина и / или высота повернутого изображения становились больше исходных размеров изображения, то пропорции не были бы точными (и иногда отрезали бы изображения ( в зависимости от угла поворота)).

Код был изменен так, чтобы высота и ширина были пропорциональны изображению из файла при создании изображения с измененным размером.

//Rotate resized image (if it should be)
$angle = $ps['product_angle'];
if (intval($angle) <> 0) {

//Get current dimensions from file
$current_source_x = imagesx($source_image);
$current_source_y = imagesy($source_image);

//Get current ratio of "scaled down image"$ratio_x = $ps['product_width'] / $current_source_x;
$ratio_y = $ps['product_height'] / $current_source_y;

//Rotate image
$source_image = imagerotate($source_image, 360-$angle, imageColorAllocateAlpha($source_image, 255, 255, 255, 127));

//Now we get a new width from the imagerotate()-function, use those to set new_width from
//ratio/propoprtions is used from origin width and height
$ps['product_width']  = imagesx($source_image) * $ratio_x;
$ps['product_height'] = imagesy($source_image) * $ratio_y;

//Set these so we can modifiy the width and height given from getimagesize()-function below
$ps['source_width'] = imagesx($source_image) ;
$ps['source_height'] =  imagesy($source_image);
}//If image is rotated, then width and height are adjusted with these values
if (isset($ps['source_width']) && isset($ps['source_height']) ) {
$source_width = $ps['source_width'];
$source_height = $ps['source_height'];
}

//Set position where to place in the image to save
$dest_x = $ps['product_left'];
$dest_y = $ps['product_top'];

$dest_width = (int)$ps['product_width'];
$dest_height = (int)$ps['product_height'];

//Resize source-image to new width and height and then copy from source to destination point
imagecopyresized($dest_image, $ps['source_image'], $dest_x, $dest_y, 0, 0, $dest_width, $dest_height, $source_width, $source_height);

Таким образом, мое окончательное решение будет включать следующие шаги:

  1. Установите соотношение / соотношение между «уменьшенным изображением» и исходным изображением.
  2. Делать актуальный поворот изображения
  3. Примените новые размеры на основе отношения, умноженного на imagesx() а также imagesy() — значения возвращаются после поворота
  4. Задавать «не настоящие» ширина и высота, когда изображение было повернуто, поэтому изменение размера будет работать пропорционально исходному изображению.

Я надеюсь, что это поможет любому, кто борется с той же проблемой, с которой я боролся (от нескольких часов до многих)!

1

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

Других решений пока нет …

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