图像在移动设备上正确旋转,而不是在桌面上旋转

时间:2015-08-21 08:39:31

标签: php iphone image image-processing

我上传的图片有一个奇怪的问题。当我在iPhone和iPad上查看它们时,它们正确旋转,但每当我尝试在桌面上查看它们时,它们都会以错误的方向显示。 我找不到错误,花了几个小时搞乱EXIF数据后,我接近放弃了。 在确定方向后,我也调整了图像的大小,但这不应该干扰其他代码。万一它,我包括它。

我没有足够的声誉来上传图片,但这里有一个指向他们的链接:
http://i.imgur.com/ARwSUuV.png
http://i.imgur.com/00yj7OJ.png

以下是我用来上传的代码:

$path_parts = pathinfo($_FILES["file"]["name"]);
$filepath = $_FILES['file']['tmp_name'];
$image = imagecreatefromstring(file_get_contents($filepath));

// Rotate image correctly!
$exif = exif_read_data($image);
if(!empty($exif['Orientation'])) {
    switch($exif['Orientation']){
        case 1: // nothing
        break;
        case 2: // horizontal flip
        $image = imageflip($image, IMG_FLIP_HORIZONTAL);
        break;
        case 3: // 180 rotate left
        $image = imagerotate($image,180,0);
        break;
        case 4: // vertical flip
        $image = imageflip($image, IMG_FLIP_VERTICAL);
        break;
        case 5: // vertical flip + 90 rotate right
        $image = imageflip($image, IMG_FLIP_VERTICAL);
        $image = imagerotate($image,-90,0);
        break;
        case 6: // 90 rotate right
        $image = imagerotate($image,-90,0);
        break;
        case 7: // horizontal flip + 90 rotate right
        $image = imageflip($image, IMG_FLIP_HORIZONTAL);
        $image = imagerotate($image,-90,0);
        break;
        case 8:    // 90 rotate left
        $image = imagerotate($image,90,0);
        break;
    }
}

switch ($path_parts['extension']) {
    case 'gif' :
    $im = imagecreatefromgif($image);
    break;
    case 'jpg' :
    $im = imagecreatefromjpeg($image);
    break;
    case 'png' :
    $im = imagecreatefrompng($image);
    break;
    case 'bmp' :
    $im = imagecreatefrombmp($image);
    break;
}
if($im){
    imagejpeg($im, $_FILES['file']['tmp_name'], 40);    
}
$image_path = 'd_'.time() . "." . $path_parts['extension']; 
$move_result = move_uploaded_file($_FILES['file']['tmp_name'], '../img/results/' . $image_path);

如果您知道为什么它只能在某些平台上正确旋转,我将非常感激!

编辑:应该澄清一下,图像通常会从智能手机或平板电脑上传。

1 个答案:

答案 0 :(得分:1)

有一些错误会阻止代码正常工作。尝试启用error reporting来帮助您调试此类问题。

  • exif_read_data()适用于文件,而非GD资源,因此请$filepath而不是$image
  • imageflip()直接操纵资源并返回bool,因此将返回值分配给$image会破坏资源。
  • 根本不需要第二个switch()语句。 imagecreatefrom___()函数从文件创建资源,但是您正在向它们传递已创建的资源 - 您只想输出它。

否则方向校正看起来很准确,应该对你有效(它在我用手机拍的各种测试照片上都有效)。

以下是更正后的代码:

$path_parts = pathinfo($_FILES["file"]["name"]);
$filepath = $_FILES['file']['tmp_name'];
$image = imagecreatefromstring(file_get_contents($filepath));

// Rotate image correctly!
$exif = exif_read_data($filepath);
if (!empty($exif['Orientation'])) {
    switch ($exif['Orientation']) {
        case 1: // nothing
            break;
        case 2: // horizontal flip
            imageflip($image, IMG_FLIP_HORIZONTAL);
            break;
        case 3: // 180 rotate left
            $image = imagerotate($image, 180, 0);
            break;
        case 4: // vertical flip
            imageflip($image, IMG_FLIP_VERTICAL);
            break;
        case 5: // vertical flip + 90 rotate right
            imageflip($image, IMG_FLIP_VERTICAL);
            $image = imagerotate($image, -90, 0);
            break;
        case 6: // 90 rotate right
            $image = imagerotate($image, -90, 0);
            break;
        case 7: // horizontal flip + 90 rotate right
            imageflip($image, IMG_FLIP_HORIZONTAL);
            $image = imagerotate($image, -90, 0);
            break;
        case 8:    // 90 rotate left
            $image = imagerotate($image, 90, 0);
            break;
    }
}

imagejpeg($image, $_FILES['file']['tmp_name'], 40);

$image_path = 'd_'.time() . "." . $path_parts['extension'];
$move_result = move_uploaded_file($_FILES['file']['tmp_name'], '../img/results/' . $image_path);