2010-11-24 16 views
18

現在、PHPとiMagickを使用して、ポスター印刷Webアプリケーションを開発しています。EXIF「オリエンテーション」データに基づいてPHP iMagick自動回転イメージを停止する方法

これは、例えば、画像Iは、アプリケーションのアップロード/画像編集機能をテストするために使用しています:しかし

[FileName] => 1290599108_IMG_6783.JPG 
    [FileDateTime] => 1290599109 
    [FileSize] => 4275563 
    [FileType] => 2 
    [MimeType] => image/jpeg 
    [SectionsFound] => ANY_TAG, IFD0, THUMBNAIL, EXIF, INTEROP, MAKERNOTE 
    [COMPUTED] => Array 
     (
      [html] => width="3504" height="2336" 
      [Height] => 2336 
      [Width] => 3504 
      [IsColor] => 1 
      [ByteOrderMotorola] => 0 
      [CCDWidth] => 22mm 
      [ApertureFNumber] => f/5.6 
      [UserComment] => 
      [UserCommentEncoding] => UNDEFINED 
      [Thumbnail.FileType] => 2 
      [Thumbnail.MimeType] => image/jpeg 
     ) 

    [Make] => Canon 
    [Model] => Canon EOS 30D 
    [Orientation] => 6 
    [XResolution] => 72/1 
    [YResolution] => 72/1 
    [ResolutionUnit] => 2 
    [DateTime] => 2009:08:31 08:23:49 
    [YCbCrPositioning] => 2 
    [Exif_IFD_Pointer] => 196 

- iMagick:

alt text

画像には、以下のEXIFデータが含まれています、この画像で__construct'edされると、それは自動的に[Orientation] => 6(私は思う!)に従ってCCWを追加90度回転させます。 ...私は知りたいのですがどのような

alt text

さ...この中で

の結果としてどのように私は、ページの上部に見える画像の元の向きを維持することができますか?これは、iMagickによって実行される自動回転を無効にすることによって可能ですか?

感謝

UPDATE:ここで私は...それはEXIFデータにオリエンテーションに基づいてオリエンテーションを修正します

public function fixOrientation() { 

     $exif = exif_read_data($this->imgSrc); 
     $orientation = $exif['Orientation']; 
     switch($orientation) { 

      case 6: // rotate 90 degrees CW 
       $this->image->rotateimage("#FFF", 90); 
      break; 

      case 8: // rotate 90 degrees CCW 
       $this->image->rotateimage("#FFF", -90); 
      break; 

     } 

} 

答えて

3

Imagick::setImageOrientationを試してみてくださいを作ってみたソリューションです。 available constantsを試してください。

+0

ありがとうizym。これらの定数がどのように使われるかについての情報はありますか? – kaese

+1

Imagick :: setImageOrientation()は実際に画像を回転させないことに注意してください。画像と共に保存されるEXIF回転情報が変更されます。いくつかのケースでは、あなたがやりたいことかもしれませんが、実際にはイメージを実際に物理的に回転させる方が良いでしょう(答えとして投稿したコードサンプルを参照)。 EXIF回転情報に頼っている問題は、すべてのWebブラウザと画像閲覧ソフトウェアが自動的に正しく向きを変えるわけではないということです。 – orrd

1

良いスタート - 機能をより堅牢にするためのいくつかの追加。まず、ケース3は、画像が上下逆に表示された場合に発生します。さまざまな方向コードby Calvin Hassの素晴らしい図があります。 exif_read_data配列の別の部分に方向情報が表示される可能性があります(カメラのモデルによって異なります)ので、私のサンプルコードではこれを考慮してみました。

このような何か:

public function fixOrientation() { 

    $exif = exif_read_data($this->imgSrc); 

    if(isset($exif['Orientation'])) 
     $orientation = $exif['Orientation']; 
    elseif(isset($exif['IFD0']['Orientation'])) 
     $orientation = $exif['IFD0']['Orientation']; 
    else 
     return false; 

    switch($orientation) { 
     case 3: // rotate 180 degrees 
      $this->image->rotateimage("#FFF", 180); 
     break; 

     case 6: // rotate 90 degrees CW 
      $this->image->rotateimage("#FFF", 90); 
     break; 

     case 8: // rotate 90 degrees CCW 
      $this->image->rotateimage("#FFF", -90); 
     break; 
    } 
} 

変換&保存がOrientationを含む以前のEXIF情報、なしであなたを残します。 Orientationである画像が欠けていると、さらに処理して再び回転させることで「修正」しようとしなくなります。私はImagickImageMagick's -auto-orientのサポートを持っていることを願っていますが、まあまあです。

ああ、また:回転はlossy operationです(jpegtranを使用しない限り)ので、サイズ変更や他の変換と組み合わせて使用​​するようにしてください。

+0

元の機能にすばらしい追加 - ありがとう! – kaese

+0

FFFはなぜ000ではないのですか?パフォーマンスに違いはありますか? –

+0

最初の引数はキャンバスの色です。 – ajmicek

39

"しかし、この画像では、iMagickは[オリエンテーション] => 6(私は思う!)のように90度のCCWを自動的にさらに回転させます。

問題は実際には逆です。 Imagick はありませんイメージを自動回転します。これらのプログラムはEXIF情報に基づいて自動的に回転するため、他のソフトウェア/ Webブラウザでは正しく表示されます。Imagickの操作によって、正しいEXIF情報(image、thumbnailImage()、stripImage()、およびその他の操作のコピー)が失われます。その場合、実際にイメージを物理的に回転させる必要があります。

ajmicekの回答は良いですが、PHP EXIF関数ではなく、Imagick独自の関数を使用することで少し改善することができます。また、そのスニペットはクラスの一部であるように見えるので、そのまま別の関数として使用することはできません。また、回転後にsetImageOrientation()を使用して正しいEXIF方向を設定することをお勧めします。

// Note: $image is an Imagick object, not a filename! See example use below. 
function autoRotateImage($image) { 
    $orientation = $image->getImageOrientation(); 

    switch($orientation) { 
     case imagick::ORIENTATION_BOTTOMRIGHT: 
      $image->rotateimage("#000", 180); // rotate 180 degrees 
      break; 

     case imagick::ORIENTATION_RIGHTTOP: 
      $image->rotateimage("#000", 90); // rotate 90 degrees CW 
      break; 

     case imagick::ORIENTATION_LEFTBOTTOM: 
      $image->rotateimage("#000", -90); // rotate 90 degrees CCW 
      break; 
    } 

    // Now that it's auto-rotated, make sure the EXIF data is correct in case the EXIF gets saved with the image! 
    $image->setImageOrientation(imagick::ORIENTATION_TOPLEFT); 
} 

使用例:

$image = new Imagick('my-image-file.jpg'); 
autoRotateImage($image); 
// - Do other stuff to the image here - 
$image->writeImage('result-image.jpg'); 
+0

すばらしい説明 - これは必要に応じて機能します。 – Brade

+0

多くの時間が節約されました。 – jack

+0

5 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ –

0

orrdの優れた答えではこのコードは、のImagickバージョン6.3+:

$イメージ - > setImageOrientation(imagick :: ORIENTATION_TOPLEFT)が必要です。

完全に動作し、OS /デバイスの向きの違いを処理します。 6.2では動作しませんでした。

私はデバイスを取得するようにコードしました。ここに誰かがそれを必要とする場合。

$ua = $_SERVER['HTTP_USER_AGENT']; 
$strcut = stristr($ua, '(')."<br>"; 
$textlen = strpos($strcut,";"); 
$deviceos = substr($strcut,1,($textlen-1)); 
echo "Device O/S: * $deviceos"."<br>"; 
関連する問題