26

現在、PHPおよびiMagickと協力して、ポスター印刷Webアプリケーションを開発しています。

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

代替テキスト

この画像には、次のEXIFデータが含まれています。

[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は、この画像を__constructすると、自動的にさらに90度CCW回転し[Orientation] => 6ます(私は思います!)。その結果...

代替テキスト

私が知りたいのは...

ページ上部に表示されている画像の元の向きを維持するにはどうすればよいですか?そして、これはiMagickによって実行される自動回転を無効にすることで可能ですか?

どうもありがとう

更新:これが私が思いついた解決策です...それは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;

       }

 }
4

5 に答える 5

58

「しかし、-iMagickは、この画像を__constructすると、[Orientation] => 6(私は思う!)に従って、自動的にさらに90度CCW回転します。」

問題は実際にはその反対です。Imagickは画像を自動回転しません。これらのプログラムはEXIF情報に基づいて自動回転するため、他のソフトウェアやWebブラウザでのみ正しく表示されます。Imagickの特定の操作により、正しいEXIF情報が失われます(画像のコピー、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');
于 2013-02-20T21:04:24.937 に答える
4

試してみてくださいImagick::setImageOrientation利用可能な定数を試してください。

于 2010-11-24T13:36:38.993 に答える
2

良いスタート-関数をより堅牢にするためのいくつかの追加。まず、ケース3は、画像が上下逆に表示される場合に発生します。CalvinHassによるさまざまなオリエンテーションコードの素晴らしいイラストがあります。方向情報が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;
    }
}

変換と保存により、を含む以前のEXIF情報がなくなりますOrientation。変換された画像が不足Orientationていると、それ以上の処理で再度回転して「修正」しようとすることができなくなります。ImagickがImageMagick-auto-orientをサポートしてくれたらいいのにと思いますが、まあ。

また、回転は(jpegtranを使用しない限り)不可逆操作であるため、サイズ変更またはその他の変換と組み合わせてのみ実行するようにしてください。

于 2012-01-20T17:36:10.123 に答える
0

orrdの優れた答えのこのコードには、iMagickバージョン6.3以降が必要です。

$ image-> 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>";
于 2014-05-31T05:42:05.897 に答える
0
function thumbnailImage($imagePath,$color,$quality)
{   

    $fileType = pathinfo($imagePath, PATHINFO_EXTENSION);

    if (!empty($fileType))
    {
        switch($fileType)
        {
            case "gif":
                $im = imagecreatefromgif($imagePath);
                break;

            case "jpg":
                $im = imagecreatefromjpeg($imagePath);
                break;

            case "jpeg":
                $im = imagecreatefromjpeg($imagePath);
                break;

            case "png":
                $im = imagecreatefrompng($imagePath);
                break;
        }
    }

    $imagick = new Imagick();
    $imagick->readImage($imagePath);
    $compression_type = Imagick::COMPRESSION_JPEG; 
    $imagick->setImageCompression($compression_type);
    $imagick->setImageCompressionQuality($quality);

    if ($fileType == "jpeg" || $fileType == "jpeg" )
    {
        $exif = exif_read_data($imagePath);
        if (!empty($exif['Orientation'])) {
            switch ($exif['Orientation']) {
                case 3:
                    $imagick = imagerotate($imagick, 180, 0);
                    break;

                case 6:
                    $imagick = imagerotate($imagick, -90, 0);
                    break;

                case 8:
                    $imagick = imagerotate($imagick, 90, 0);
                    break;
            }
        }
    }
    $imagick->setImageBackgroundColor($color);
    $imagick->thumbnailImage(150, 150, true, true);
    header("Content-type: image/jpg");
    echo $imagick->getImageBlob();
}

超簡単なサムネイル。と電話する

thumbnailImage('file.ext','#ffffff',50); // full path, color, quality 1-100

で動作しますが、明らかにjpegでのみjpg動作しますgifpngEXIF

サムネイルがページに読み込まれ、指定するとURLで呼び出すことができます$_GETs

楽しい

于 2020-01-16T16:56:09.310 に答える