2011-03-14 29 views
10

我想上傳一個base64編碼的圖像和解碼之後保存自動旋轉。圖像上傳和保存,我可以訪問它使用的URL和一切..但圖像逆時針旋轉90度,我不知道爲什麼!圖像獲取有關上傳

從哪裏獲得的編碼數據也好,把它在<img />的地方工作正常!

function saveImageData($base64Data) { 
    $base64_decoded = base64_decode($base64Data); 
    $im = imagecreatefromstring($base64_decoded); 
    if ($im !== false) { 
     $imagepath = '/public/uploads/' . time() . '.jpg'; 
     imagejpeg($im, $imagepath); 
     chmod($imagepath, 0755); 
     imagedestroy($im); 
    } else { 
     return false; 
    } 
    return $imagepath; 
} 

我沒有使用任何旋轉功能,但仍然旋轉。我可以使用PHP的GD函數一樣imagerotate,但不希望像黑色的背景等

如果你能help..you r爲awesomest人的原因!

+0

我知道這是舊的,但只是想我會提到:如果你能幫助它,不要上傳之前base64encode照片。你增加了20%的大小。 PhoneGap支持文件上傳http://docs.phonegap.com/en/1.9.0/cordova_file_file.md.html#FileTransfer – 2012-07-03 00:31:33

+0

當時,我寫這篇文章的時候,Phonegap不是Codorva,只是Nitobi的Phonegap和API都沒有。 t支持多部分POST請求。 此外,我們決定放棄Phonegap&原生! – detj 2012-07-03 18:34:33

+0

我遇到與移動網絡應用相同的問題。任何想法爲什麼? – Orane 2015-05-20 00:42:31

回答

14

我的猜測是,你要上傳的圖像實際上是旋轉,但被糾正,因爲它包含了EXIF部分旋轉數據。 (例如,相機在拍攝照片時可能會知道縱向方向,並將該信息保存在EXIF數據中;某些查看軟件會知道旋轉數據,並在查看照片時自動旋轉照片。)在這種情況下,圖片可能只是出現爲你旋轉,這取決於你用什麼來查看它。

是否使用相同的軟件查看「上傳之前」和「上傳後」的圖像?如果你看到他們都使用同一個網絡瀏覽器會發生什麼情況呢?

,如果你從不同的來源嘗試不同的形象,最好是會發生什麼?你有任何軟件可以讓你查看圖像的EXIF數據嗎?尋找「方向」價值;除了「1」以外的任何東西都意味着圖像有一個旋轉設置(請參閱this page以獲得體面的描述)。

因此,總之,我想說JPEG文件中的底層圖像是「錯誤的「方向,並且EXIF數據包含糾正該旋轉以進行顯示的信息。例如,如果來源是剛剛與我一起玩過的iPhone似乎以橫向方向存儲其底層圖像數據,但是如果實際拍攝圖像(因此應該顯示該圖像)則設置EXIF數據)作爲肖像。解決它

最好的辦法是幾乎可以肯定檢查EXIF數據在上傳後的文件,使用PHP EXIF functions和旋轉圖像需要保存自己的副本之前,糾正方向。

+0

感謝您的洞察!我實際上是從iPhone/iPod Touch相機拍攝照片或從iOS相冊中選擇。基本上,我使用Phonegap構建iOS應用程序(http://phonegap.com) 我會檢查這個EXIF方向的東西,然後回去..也許這可能是它! – detj 2011-03-14 18:36:31

+0

這裏的PhoneGap的文檔(http://docs.phonegap.com/phonegap_camera_camera.md.html#Camera),那我下面進入正base64編碼的圖像數據 – detj 2011-03-14 18:41:20

+0

@detj是的,如果它是一個圖像從iPhone,我認爲我的理論很可能是對的。例如,我只用iPhone拍攝了兩張照片,一張橫向照片,一張縱向照片。雖然它們在iPhoto中看起來都具有「正確」的方向,例如,這些圖片本身都是* 2048 *寬* 1536 *高*,甚至是「肖像」照片。縱向照片實際上存儲爲橫向,EXIF數據表示它已旋轉,因此iPhoto會自動更正。我猜這張照片是通過_unchanged_到達您的網站的,但展示的只是原始的,未旋轉的圖像。 – 2011-03-14 23:45:04

1

我在製作移動混合應用程序時遇到此問題,該應用程序使用Cordova訪問手機相機並將圖像發佈到服務器。我通過將correctOrientation屬性設置爲true來解決它。

navigator.camera.getPicture(onSuccess, onFail, 
         { 
          quality: 80, 
          destinationType:Camera.DestinationType.DATA_URL, 
          correctOrientation : true 
         }); 
0
<?php 
if (isset($_POST['submit'])) { 
    $filename = $_FILES['file']['name']; 
    $filePath = $_FILES['file']['tmp_name']; 
    $exif = exif_read_data($_FILES['file']['tmp_name']); 
    echo "<pre>"; 
    print_r($exif); 
    echo "</pre>"; 
    if (!empty($exif['Orientation'])) { 
     $imageResource = imagecreatefromjpeg($filePath); 
     switch ($exif['Orientation']) { 
      case 3: 
       $image = imagerotate($imageResource, 180, 0); 
       break; 
      case 6: 
       $image = imagerotate($imageResource, -90, 0); 
       break; 
      case 8: 
       $image = imagerotate($imageResource, 90, 0); 
       break; 
      default: 
       $image = $imageResource; 
     } 
     imagejpeg($image, $filename, 90); 
    } 
} 
?> 
<form class="form-horizontal" method="post" enctype="multipart/form-data"> 
    <div class="form-group"> 
     <div class="col-md-9"> 
      <div class="input-group"> 
       <span class="input-group-btn"> 
        <span class="btn btn-default btn-file"> 
         Choose img<input type="file" name="file" id="imgInp"> 
        </span> 
       </span> 

      </div> 
     </div> 
    </div> 
    <button name="submit" type="submit">Send</button> 
</form>