изменение размера изображения в PHP

Пока я занимался обработкой изображений, я обнаружил, что GD и Imagick в PHP не изменяют размер изображения до идентичного уровня цвета в пикселях, что в большинстве случаев было не нужно. Теперь, на всякий случай, мне нужно изображение любого размера для масштабирования до 256 * 256.

Чтобы убедиться, что результаты ТЕСТА непротиворечивы, я использовал изображение 256 * 256 и изменил его размер до собственного размера.

что я пытался:

imagecopyresized($new, $img, 0, 0, $x, 0, $width, $height, $w, $h); //256 , 256

а также

$compression_type = imagick::COMPRESSION_NO;
$images_ima = new Imagick($image_path);    //$image_path = path to image...
$images_ima->setImageCompression($compression_type); 
$images_ima->setImageCompressionQuality(100); 
$images_ima->sampleImage($X_SIZE,$Y_SIZE); // 256 ,256
$images_ima->writeImages($dest_path, true); //destination path

ни один из них не работал, если я сравню вывод с исходным изображением, он будет выглядеть примерно так: Сравнение слияния Araxis  исходный VS с измененным размером

похоже, что функции, которые я использовал, передискретизируют изображение, поскольку различия в значении RGB между обоими изображениями невелики

я могу добиться одинакового изменения размера пикселя в пиксель с 256 * 256 до 256 * 256 в фотошопе, предварительном просмотре OSX и даже Pixelformer. мне было интересно, как это можно сделать в PHP?


person tom91136    schedule 06.01.2012    source источник
comment
Почему бы вам просто не использовать imagecopy, если вы обнаружите, что размеры в пикселях идентичны?   -  person My Other Me    schedule 09.01.2012
comment
Я не уверен, что полностью понимаю ваш вопрос, но каждая библиотека обработки изображений обычно не использует один и тот же точный алгоритм. Какими бы ни были ваши тесты, они не могут полагаться на такое предположение.   -  person Álvaro González    schedule 09.01.2012


Ответы (1)


Поскольку формат вашего изображения (jpeg - предполагается из настройки качества 100) является форматом с потерями, вы не получите пропускную способность без потерь таким образом, когда вы повторно сжимаете изображение.

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

Когда вы не изменяете размеры (исходные размеры = размеры после изменения размера) в предварительном просмотре Photoshop или OSX, они не будут повторно сжимать изображение, поэтому вы не увидите никаких изменений.

person bardiir    schedule 09.01.2012
comment
но в моем коде есть строка, в которой я устанавливаю значение сжатия 100, что не является сжатием. разве это не несжатое изображение останется прежним? даже если я использую JPEG, когда произойдет потеря качества; почему значение пикселя не изменилось даже до того, как я его сжал? Например, => imagecolorat($img).... полученные значения не идентичны исходным. - person tom91136; 09.01.2012
comment
jpeg с качеством 100 далек от несжатого - person bardiir; 09.01.2012
comment
если вы получаете разные значения цвета сразу после распаковки, вы можете проверить наличие цветовых профилей в изображении, поскольку imagemagick/gd может игнорировать их, в отличие от некоторых программ редактирования изображений... - person bardiir; 09.01.2012
comment
ооо.. я не думал об этом, да, я попробую, проверив цветовой профиль - person tom91136; 09.01.2012
comment
пробовал, нет, вот почему => 1) прочитать изображение в $img 2) imagecolorat($img) (нет изменений по сравнению с исходным изображением в ЭТОМ ШАГЕ) 3)imagecopyresized($img) 4) imagecolorat($img) опять же, значения СЕЙЧАС изменены... - person tom91136; 10.01.2012
comment
в любом случае, вы указываете мне правильное направление, в моем коде есть несколько мест, где нет определенного цветового профиля, поскольку все еще читается изображение, я создам свою собственную функцию для изменения размера изображений и установки цветовых профилей. но все же, если есть, что добавить, пожалуйста :) - person tom91136; 10.01.2012
comment
Я почти уверен, что это связано с повторным сжатием, вы можете попробовать использовать изображения png или bmp, поскольку это форматы без потерь. Если они не меняются, то, скорее всего, проблема с повторным сжатием изображения. С другой стороны, это будет не первая ошибка, с которой я сталкиваюсь в imagemagick, возможно, вы захотите добавить это в их багтрекер на всякий случай :) - person bardiir; 10.01.2012