0

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

谢谢!

4

2 回答 2

1

在我的“gallery3”照片库中看到同样的问题。像 machouinard 一样,我使用“jhead -norot filename.jpg”从图像中去除方向标头。这解决了 Apple 旋转问题,并且似乎不会弄乱其他浏览器。

要编辑一堆文件,我直接进入 (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:然后我进入画廊维护模式并运行“重建图像”实用程序。

于 2011-09-06T03:41:13.317 回答
0

忘了我发了这个。我想出了如何处理方向问题,所以我想我会分享。现在看起来很简单。我已经使用 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();
 }
 }
 }
 }

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

标记

于 2011-12-21T12:00:28.190 回答