【问题标题】:PHP image gallery- dealing with iPhone / iPad imagesPHP 图片库 - 处理 iPhone / iPad 图片
【发布时间】:2011-06-17 23:35:40
【问题描述】:

我用 php 和 mysql 创建了一个图片库,结合了多种添加图片的方法以及按添加方法和/或类别进行排序的能力。在注意到来自苹果设备的一些图像以“错误”的方向显示后,我创建了另一个页面来编辑方向和其他文件信息,然后将所述更改保存回文件和数据库。只有在我认为我已经解决了这个问题之后,我才在苹果设备上查看了更改后的图像,才意识到该图像现在在所述设备上处于“错误”方向。我一直在谷歌上搜索这个,但不能完全弄清楚我现在需要学习什么来处理这种情况下来自苹果设备的图像。非常感谢您朝正确的方向推进。

谢谢!

【问题讨论】:

  • 如果您有处理来自 iPhone/iPad 等图像的方法,则在数据库中记下它已被翻转,然后在翻转的图像上将它们翻转回来,然后再发送给用户,或让用户选择在下载/查看之前选择方向,这不是您的错,用户以错误的方向添加图像。
  • 过去 3 天我一直在试图解决这个问题。我想要的只是以预期的方式显示上传的 iphone 图像。如果我旋转图像以在计算机屏幕(pc 或 macbook)上正确显示,那很好,但在 iphone/ipad 上查看时图像方向关闭。我只是使用 php 来显示存储在我的服务器上的图像,但我什至找不到一个不那么简单的答案。我已经阅读了数百篇文章并关注了数百个链接。谷歌甚至提供了我的原始帖子(上周五,在我发布它 20 分钟后 - 去图)。我需要成为一名IOS程序员吗?
  • 好的,这是一个临时的胶带解决方案,但我使用 jhead -norot 来清除 exif 旋转标签。如果有人有更好的建议,我很乐意听到。

标签: php uiimage image-rotation


【解决方案1】:

在我的“gallery3”照片库中看到了同样的问题。像 machouinard 一样,我使用“jhead -norot filename.jpg”从图像中去除方向标头。这样就解决了苹果轮播的问题,而且似乎没有搞乱其他浏览器。

要编辑一堆文件,我直接进入(gallerytop)/lib/albums 中的相册存储区并执行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。然后我进入图库维护模式并运行“重建图像”实用程序。

【讨论】:

    【解决方案2】:

    忘了我发了这个。我想出了如何处理方向问题,所以我想我会分享。现在看起来很简单。我已经使用 Codeigniter 重新创建了这个项目。 CI 很棒,可以节省很多时间,但我很高兴我第一次自己编写了它。我确实通过这种方式学到了更多。

    首先,如果文件是 jpg,我会得到带有 PEL 的 EXIF 数据。

    $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();
     }
     }
     }
     }
    

    希望这对遇到同样问题的其他人有所帮助。 如果您发现任何可以改进的地方,请告诉我。但这对我很有用。

    标记

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 1970-01-01
      • 2012-02-13
      • 2012-08-30
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多