Изображение искажается при загрузке и превращении в миниатюру - PullRequest
0 голосов
/ 25 февраля 2012

Все, я загружаю изображение, а затем делаю его миниатюру для отображения.Я использую следующий код для обработки своей загрузки:

$imageW = $blogOptions['image']['width'];
$imageH = $blogOptions['image']['height'];
$themePath = ABSPATH . 'wp-content/';
$path_to_image_directory = $themePath.'uploads/';  
$path_to_thumbs_directory = $themePath.'uploads/thumbs/';
$fieldname = 'logo';

if(preg_match('/[.](jpg)|(gif)|(png)|(JPG)$/', $_FILES[$fieldname]['name'])) {
$now = time();
$filename = $now."_".$_FILES[$fieldname]['name'];
$source = $_FILES[$fieldname]['tmp_name'];  
$target = $path_to_image_directory . $filename;  
move_uploaded_file($source, $target);

$file = $path_to_image_directory . $filename;
$x = @getimagesize($file);
switch($x[2]) { 
case 1: 
    $type = "gif";  
    break; 
case 2: 
    $type = "jpeg";
    break; 
case 3: 
    $type = "png";   
    break; 
default: 
    echo "error";
}

if($type == "gif"){
$im = imagecreatefromgif($path_to_image_directory . $filename);   
}if($type == "jpeg"){ 
$im = imagecreatefromjpeg($path_to_image_directory . $filename); 
}if($type == "png"){ 
$im = imagecreatefrompng($path_to_image_directory . $filename);   
} 

$ox = imagesx($im);  
$oy = imagesy($im);  

$nx = $imageW;  
$ny = $imageH;

$nm = imagecreatetruecolor($nx, $ny);  

imagecopyresized($nm, $im, 0,0,0,0,$nx,$ny,$ox,$oy);  

if(!file_exists($path_to_thumbs_directory)) {  
    if(!mkdir($path_to_thumbs_directory)) {  
        die("There was a problem. Please try again!");  
    }   
}

if($type == "gif"){
imagegif($nm, $path_to_thumbs_directory . $filename);   
}if($type == "jpeg"){ 
imagejpeg($nm, $path_to_thumbs_directory . $filename); 
}if($type == "png"){ 
imagepng($nm, $path_to_thumbs_directory . $filename);  
}
}
}

Загрузка работает нормально, и файл успешно создается, однако при его отображении изображение выглядит крайне искаженным.Если я использую Wordpress для обработки загрузки файла и создания эскиза, это не выглядит искаженным вообще.Есть ли лучший способ загрузить этот файл или я не ошибаюсь, чтобы не потерять качество изображения?

Спасибо!

Ответы [ 2 ]

1 голос
/ 25 февраля 2012

Вы не сделали никакого масштабирования - если вы хотите иметь фиксированную ширину и высоту миниатюры, она будет искажена.

Чтобы выполнить масштабирование, выполните следующие действия:

$original_width = imagesx($im);
$original_height = imagesy($im);

$scaling_factor = ($original_width / $desired_width);
$new_width = $desired_width;
$new_height = ($original_height / $scaling_factor);

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

1 голос
/ 25 февраля 2012

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

Вы можете настроить исходную обрезку следующим образом (не проверено):

$oy = floor($ox * $ny / $nx);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...