2015-02-27 2 views
1

продолжения к этому вопросу: How to get new width and height after an image has been rotated with 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);  

Возможно, я что-то очень существенное ....

UPDATE

Пример реальных значений отсутствует ...

image current width63.224619257754 
image current height80.210337864315 

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

where angle is 41.10419020401479 
+0

Пожалуйста, добавьте детали на свой вопрос: Какая ошибка, какие значения у вас есть? – Daniel

+0

Я обновил свой вопрос, потому что у меня были некоторые ошибки копирования и вставки, но кроме того - я не получаю ожидаемой ширины и высоты ($ new_width и $ new_height). – bestprogrammerintheworld

+0

Новая ширина и высота становятся очень маленькими. Посмотрите на обновление – bestprogrammerintheworld

ответ

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; 

} 

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

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

//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

Хорошая работа над этим. – Daniel

Смежные вопросы