Документация для imagerotate относится к другому типу для первого параметра, чем вы используете:
Ресурс изображения, возвращенный одной из функций создания изображения, например, imagecreatetruecolor ().
blockquote>Вот небольшой пример использования этой функции:
function resample($jpgFile, $thumbFile, $width, $orientation) { // Get new dimensions list($width_orig, $height_orig) = getimagesize($jpgFile); $height = (int) (($width / $width_orig) * $height_orig); // Resample $image_p = imagecreatetruecolor($width, $height); $image = imagecreatefromjpeg($jpgFile); imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); // Fix Orientation switch($orientation) { case 3: $image_p = imagerotate($image_p, 180, 0); break; case 6: $image_p = imagerotate($image_p, -90, 0); break; case 8: $image_p = imagerotate($image_p, 90, 0); break; } // Output imagejpeg($image_p, $thumbFile, 90); }
Мне не нравится перекликаться с еще одним набором значений ориентации, но, по моему опыту, используя любое из значений, перечисленных выше, я всегда получал перевернутые изображения при загрузке портретных снимков ориентации непосредственно с iPhone. Вот оператор switch, с которым я закончил.
switch ($exif['Orientation']) {
case 3:
$image = imagerotate($image, -180, 0);
break;
case 6:
$image = imagerotate($image, -90, 0);
break;
case 8:
$image = imagerotate($image, 90, 0);
break;
}
Возможно, стоит упомянуть, что если вы используете ImageMagick из командной строки, вы можете использовать опцию -auto-orient , которая автоматически поворачивает изображение на основе существующих данных ориентации EXIF.
convert -auto-orient /tmp/uploadedImage.jpg /save/to/path/image.jpg
Обратите внимание: если данные EXIF были удалены перед процессом, они не будут работать, как описано.
Изображение вмешательства имеет метод orientate()
.
$img = Image::make('foo.jpg')->orientate();
На всякий случай кто-то сталкивается с этим. Из того, что я могу сделать, некоторые из приведенных выше операторов переключения неверны.
На основе информации здесь это должно быть:
switch ($exif['Orientation']) {
case 3:
$image = imagerotate($image, -180, 0);
break;
case 6:
$image = imagerotate($image, 90, 0);
break;
case 8:
$image = imagerotate($image, -90, 0);
break;
}
jhead -autorot jpegfile.jpg
Также полезный способ приблизиться к этому.
jhead - стандартная программа в Linux (используйте 'sudo apt-get install jhead' для install), эта опция смотрит на ориентацию и правильно поворачивает изображение и без потерь, только если это требуется. Затем он также правильно обновляет данные EXIF.
Таким образом вы можете обрабатывать jpeg (или несколько jpegs в папке) простым одноразовым способом, который постоянно фиксирует проблемы с ротацией.
Например: jhead -autorot * .jpg исправит целую папку jpeg-изображений только так, как требует OP в начальном вопросе.
Хотя это не технический PHP, я прочитал этот поток, а затем использовал вместо моего вызова jhead, вызванного из вызова PHP system () для достижения результатов, которые были после этого совпали с OP: для поворота изображений, чтобы любое программное обеспечение (например, «fbi» в Raspbian) отображало их правильно.
В свете этого я думал, что другие могут извлечь выгоду из знания того, как легко jhead решает эту проблему и размещает информацию здесь только в информационных целях, потому что никто ранее не упоминал об этом.
Основываясь на коде Дэниела, я написал функцию, которая просто поворачивает изображение, если это необходимо, без повторной выборки.
function image_fix_orientation(&$image, $filename) {
$exif = exif_read_data($filename);
if (!empty($exif['Orientation'])) {
switch ($exif['Orientation']) {
case 3:
$image = imagerotate($image, 180, 0);
break;
case 6:
$image = imagerotate($image, -90, 0);
break;
case 8:
$image = imagerotate($image, 90, 0);
break;
}
}
}
function image_fix_orientation(&$image, $filename) {
$image = imagerotate($image, array_values([0, 0, 0, 180, 0, 0, -90, 0, 90])[@exif_read_data($filename)['Orientation'] ?: 0], 0);
}
function image_fix_orientation($image) {
if (method_exists($image, 'getImageProperty')) {
$orientation = $image->getImageProperty('exif:Orientation');
} else {
$filename = $image->getImageFilename();
if (empty($filename)) {
$filename = 'data://image/jpeg;base64,' . base64_encode($image->getImageBlob());
}
$exif = exif_read_data($filename);
$orientation = isset($exif['Orientation']) ? $exif['Orientation'] : null;
}
if (!empty($orientation)) {
switch ($orientation) {
case 3:
$image->rotateImage('#000000', 180);
break;
case 6:
$image->rotateImage('#000000', 90);
break;
case 8:
$image->rotateImage('#000000', -90);
break;
}
}
}
Здесь я объясняю все это, я использую Laravel и использую пакет Imaging Imaging.
Прежде всего, я получаю свое изображение и отправляю его другой функции для изменения размера и некоторых других функций , если нам это не нужно, вы можете пропустить ...
Возьмите файл с помощью метода в моем контроллере,
public function getImageFile(Request $request){
$image = $request->image;
$this->imageUpload($image);
}
Теперь я отправляю его для изменения размера и получения имя изображения и расширение ...
public function imageUpload($file){
ini_set('memory_limit', '-1');
$directory = 'uploads/';
$name = str_replace([" ", "."], "_", $file->getClientOriginalName()) . "_";
$file_name = $name . time() . rand(1111, 9999) . '.' . $file->getClientOriginalExtension();
//path set
$img_url = $directory.$file_name;
list($width, $height) = getimagesize($file);
$h = ($height/$width)*600;
Image::make($file)->resize(600, $h)->save(public_path($img_url));
$this->image_fix_orientation($file,$img_url);
return $img_url;
}
Теперь я вызываю свою функцию ориентации изображения,
public function image_fix_orientation($file,$img_url ) {
$data = Image::make($file)->exif();
if (!empty($data['Orientation'])) {
$image = imagecreatefromjpeg($file);
switch ($data['Orientation']) {
case 3:
$image = imagerotate($image, 180, 0);
break;
case 6:
$image = imagerotate($image, -90, 0);
break;
case 8:
$image = imagerotate($image, 90, 0);
break;
}
imagejpeg($image, $img_url, 90);
}
}
И это все ...
Упрощенная функция для тех, кто загружает изображение, он просто авторотирует, если необходимо.
function image_fix_orientation($filename) {
$exif = exif_read_data($filename);
if (!empty($exif['Orientation'])) {
$image = imagecreatefromjpeg($filename);
switch ($exif['Orientation']) {
case 3:
$image = imagerotate($image, 180, 0);
break;
case 6:
$image = imagerotate($image, -90, 0);
break;
case 8:
$image = imagerotate($image, 90, 0);
break;
}
imagejpeg($image, $filename, 90);
}
}