imagecopyresampled иногда создавая пустые изображения - PullRequest
1 голос
/ 19 мая 2011

Я изменяю размер изображения, используя:

//load file and dimensions
$obj_original_image = imagecreatefromjpeg($str_file_path);
list($int_width, $int_height, $image_type) = getimagesize($str_file_path);

//compress file
$int_thumbnail_width = 320;
$int_ratio = $int_thumbnail_width / $int_width;
$int_new_width = $int_thumbnail_width;
$int_new_height = $int_height * $int_ratio;

$obj_image = imagecreatetruecolor($int_new_width, $int_new_height);
imagecopyresampled($obj_image, $obj_original_image, 0, 0, 0, 0, $int_new_width,     $int_new_height, $int_width, $int_height);
imagejpeg($obj_image, $GLOBALS['serverpath'] . '/images/uploaded/video-thumbs/'.$arr_data['thumbnail_folder'].'/' . $arr_data['id']. '.jpg', $int_compression = 85);

И это обычно работает отлично. Однако иногда он создает чистое белое изображение. Я прочитал эту заметку на http://php.net/manual/en/function.imagecopyresampled.php:

Проблема из-за ограничений изображения палитры (255 + 1 цветов). Для повторной выборки или фильтрации изображения обычно требуется больше цветов, чем 255, для вычисления нового пикселя и его цвета используется своего рода аппроксимация. С помощью изображения палитры мы пытаемся выделить новый цвет, если это не удалось, мы выбираем наиболее близкий (теоретически) вычисляемый цвет. Это не всегда самый близкий визуальный цвет. Это может привести к странным результатам, таким как пустые (или визуально пустые) изображения. Чтобы пропустить эту проблему, используйте в качестве конечного изображения изображение в истинном цвете, например, созданное с помощью imagecreatetruecolor ().

Однако я уже использую imagecreatetruecolor. Я всегда масштабирую изображения одинакового размера, поэтому это не может быть проблемой ширины / высоты. Это происходит только иногда, в большинстве случаев масштабирование изображения работает нормально. Есть идеи, как это исправить?

Ответы [ 2 ]

0 голосов
/ 19 мая 2011

Вы упомянули, что размер обрабатываемого изображения всегда одинаков, но всегда ли разрешение одинаково? Если у вас есть изображение с особенно высоким разрешением, с которым вы работаете, возможно, вам не хватает памяти для определенных операций, которые, по моему опыту, приведут к чистому белому изображению. Если это так, вы можете попытаться исправить это, увеличив объем памяти, выделенной для PHP в php.ini под параметром memory_limit. Насколько я знаю, это значение относится к манипуляциям с изображениями.

0 голосов
/ 19 мая 2011

Нет смысла использовать getimagesize(), когда вы уже открыли изображение с помощью imagecreatefromjpeg().Вы можете использовать imagesx() и imagesy(), чтобы получить ширину / высоту.getimagesize отделен от GD и снова откроет изображение, повторно проанализирует его и т. д.соответствующая createfrom функция.imagecreatefromjpeg() потерпит неудачу, если вы попытаетесь открыть что-нибудь ДРУГОЕ, чем изображение .jpg.

$obj_original_image = imagecreatefromjpeg($str_file_path);
if ($obj_original_image === FALSE) {
   die("Unable to load $str_file_path. Not a jpg?");
}

etc... etc...

$status = imagecopyresampled($obj_image, $obj_original_image, 0, 0, 0, 0, $int_new_width,     $int_new_height, $int_width, $int_height);

if ($status === FALSE) {
    die("imagecopyresampled failed!");
}

Также добавьте некоторую отладку в ваши вычисления высоты / ширины - выведите значения, которые вы генерируете.Может быть, один или несколько из них получаются как 0, так что вы в конечном итоге ресэмплируете до несуществующего размера.

...