Галерея изображений PHP - работа с изображениями iPhone / iPad - PullRequest
0 голосов
/ 18 июня 2011

Я создал галерею изображений с php и mysql, включающую несколько способов добавления изображений и возможность сортировки по методу добавления и / или категории. Заметив, что некоторые изображения с устройств Apple отображаются с «неправильной» ориентацией, я создал другую страницу для редактирования ориентации и другой информации о файле, а затем сохранил указанные изменения обратно в файл и в базу данных. Только после того, как я решил, что решил эту проблему, я просмотрел измененные изображения на устройстве Apple, только чтобы понять, что изображение теперь было в «неправильной» ориентации на указанном устройстве. Я гуглил это, но не могу понять, что именно мне нужно сейчас изучить, чтобы иметь дело с изображениями с устройств Apple в этой ситуации. Пуш в правильном направлении был бы очень признателен.

Спасибо!

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

Видя ту же проблему в моей фотогалерее "gallery3". Как и Machouinard, я использую "jhead -norot filename.jpg", чтобы убрать заголовок ориентации из изображений. Это устраняет проблему с ротацией Apple и, похоже, не портит другие браузеры.

Чтобы отредактировать кучу файлов на месте, я иду прямо в область хранения альбомов в (gallerytop) / lib / album и делаю find -type f | xargs sudo jhead -norot. Он достаточно умен, чтобы изменять только те файлы, которые нужно изменить, и выводит их список на стандартный вывод во время его работы.

Чтобы заставить gallery3 обновить миниатюры, я захожу в базу данных и устанавливаю «грязные» флаги следующим образом: echo "update items set thumb_dirty=1,resize_dirty=1 where relative_path_cache like 'ALBUMNAME/%';" | mysql -u root -p gallery3. Затем я вхожу в режим обслуживания галереи и запускаю утилиту «rebuild images».

0 голосов
/ 21 декабря 2011

Забыл, я отправил это. Я понял, как справиться с проблемой ориентации, поэтому решил поделиться. Кажется, теперь просто. С тех пор я воссоздал этот проект с использованием Codeigniter. КИ великолепен и экономит много времени, но я рад, что написал все сам в первый раз. Я уверен, что узнал больше таким образом.

Во-первых, если файл является jpg, я получаю данные EXIF ​​с помощью PEL .

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

       $this->load->library('pel/PelJpeg');


       if($ext == 'jpg'){
            $pdw= new PelDataWindow(file_get_contents($new));
            if(PelJpeg::isValid($pdw)){
                $input_jpg = new PelJpeg($new);
                $exif = $input_jpg->getExif();
            }
        }

Затем, если EXIF ​​существует, получите значение ориентации и пропустите его через оператор switch, поверните его соответствующим образом и затем сбросьте значение ориентации. Я использую image_moo и Codeigniter, но это, очевидно, можно изменить, чтобы использовать любую библиотеку для работы с изображениями.

Честно говоря, я не уверен, что все эти операторы IF должны быть там, но я продолжал сталкиваться с проблемами с jpg, которые включали только некоторую информацию EXIF ​​и взорвали сценарий без них.

 if($exif !== NULL){
 if($tiff = $exif->getTiff()){
 if($ifd0 = $tiff->getIfd()){
 if($orient = $ifd0->getEntry(PelTag::ORIENTATION)){
 $this->image_moo->load($new);

 //find the orientation value from the orientation tag.  May be a better way, but this works for me.                                    
 $orientation = str_replace(' ', '', $orient);
 //The orientation value from the orientation tag is after 'Value:'
 if (($tmp = strstr($orientation, 'Value:')) !== false) {
      $str = substr($tmp, 6, 1);
 }

 switch ($str)
 {
     // up is pointing to the right
     case 8:
       $this->image_moo->rotate(90);
       $orient->setValue(1);
       break;
     // image is upside-down
     case 3:
       $this->image_moo->rotate(180);
       $orient->setValue(1);
       break;
     // up is pointing to the left
     case 6:
       $this->image_moo->rotate(270);
       $orient->setValue(1);
       break;
     // correct orientation
     case 1:
       break;
       }
     $this->image_moo->save($new,TRUE);
     if ($this->image_moo->errors) print $this->image_moo->display_errors();
     $this->image_moo->clear();
 }
 }
 }
 }

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

Mark

...