Можно ли выполнить вращение без потерь на изображении JPEG в PHP? - PullRequest
4 голосов
/ 27 июля 2010

Мне нужно повернуть несколько существующих изображений JPG. Они уже потеряли некоторые детали, но теперь я хочу повернуть их и больше не терять детали.

После небольших исследований кажется, что единственная библиотека ротации изображений без потерь для PHP - это использование библиотеки jPegTran .

Есть ли другие варианты, когда нужно сделать вращение в формате jpg без потерь?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 27 июля 2010

Разве нельзя было бы вызвать внешнюю программу, скажем, losslessrotator с помощью exec ('commandline');

Другой вариант будет jpegtran от jpegclub

1 голос
/ 06 апреля 2011

Будьте осторожны с jpegtran при повороте cw или ccw на 90 градусов, он не будет поворачивать все пиксели, как ожидалось, поскольку он может выполнять вращение без потерь только в пределах области, размеры которой кратны размеру блока jpeg (обычно 8x8 пикселей) , Он вращает пиксели внутри каждого из этих блоков внутри, чтобы избежать повторного сжатия изображения, но краевые блоки не могут вращаться таким образом. Так что с jpegtran -rotate 90 или 270 у вас останется крошечная полоска неповоротных пикселей по краю, и вам нужно использовать опцию -trim, чтобы избавиться от них, но тогда результирующее изображение будет на несколько пикселей меньше чем оригинал.

Так что, хотя это вращение без потерь, вы все равно теряете несколько пикселей в процессе.

0 голосов
/ 27 июля 2010

JPEG - это формат с потерями, поэтому ответ - нет, вы не можете создать поворот JPEG без потерь в любом приложении, языке программирования или медитации гуру.минимизируйте потерю данных изображения, используя аргумент $quality при сохранении повернутого JPEG, если вы сохраняете его в формате JPEG, который есть.Если вы сохраняете его в формате без потерь, то вы уже минимизировали потерю данных изображения.

Пример:

$img = imagecreatefromjpeg($file);
$rot = imagerotate($img, 90, 0);
imagejpeg($rot, $output, 100); /* set quality to 100% */
...