2013-10-07 78 views
1

在Safari iOS中,已知問題是用相機拍攝的大圖像上設置了exif方向標誌,這使得在查看時圖像的方向不正確。例如,如果iPhone處於縱向並拍攝了照片,則生成的圖像將顯示爲旋轉到橫向。已經創建了名爲megapix-image.js和exif.js的Jquery插件,通過檢測攝像機圖像上的exif方向標誌並自動旋轉圖像來補償它,以處理這種情況。我在我的Web應用程序中使用它,它在客戶端很好,但我遇到的問題是我需要將旋轉後的圖像返回到服務器。發送回服務器的圖像是輸入類型=文件控制中的圖像。這是megapix-image用來旋轉圖像的圖像的來源。我需要做的是將存儲在輸入類型=文件控制內的圖像替換爲旋轉後的圖像,這樣它將成爲上傳的圖像。換句話說,只是在客戶端旋轉圖像是沒有意義的,除了讓用戶暫時看到圖像與使用相機拍攝照片時的方向相同。最重要的是旋轉的圖像被上傳回服務器。我希望我清楚地說明了這一點,這很有道理。如何將旋轉後的圖像放回到輸入類型=文件控件中,以便它將成爲上傳的圖像,而不是方向不正確的圖像?Exif iOS中的定位問題

編輯:

我做了各種設備的一些測試:iPhone4上運行iOS 7,iPad上運行的iOS 7,和iPad運行iOS 6,方向問題同時存在於Safari瀏覽器,並通過在服務器上輸入類型=文件控制。垂直壓縮/子採樣問題在iPhone4和iPad上的iOS 7中得到修復。在運行iOS 7的iPhone 5C上,Safari中的方向是正確的,但存在垂直壓縮/子採樣問題。

正如雷Nicholus上面所說的,你不能修改文件控制內的圖像文件的數據,所以不管是做必須做服務器端:

+0

您不能修改文件輸入元素的值。您有2個選項:1.)在畫布上修改圖像,然後導出到「Blob」或數據URL並將其發送到您的服務器。 2.)檢測用戶訂購的方向更改,將元數據與原始圖像一起傳遞到服務器,並在服務器端旋轉它。恕我直言,不建議您使用#1,因爲您最終將發送一個包含所有EXIF數據的圖像。但是,您可以重新插入(修改後的)EXIF數據並將其上傳,但我認爲這可能不是微不足道的。 –

+0

另外,我不確定我是否理解您指的是什麼問題。我不知道iOS中有任何寫入方向標記值不正確的錯誤。您可能會將此與iOS針對2 MP或更大圖像執行的img子採樣混淆。或者你也可能把這個事實與iOS中的Safari實際上在顯示img時考慮到方向標誌的事實相混淆,而大多數其他瀏覽器則沒有。 –

+0

如果我不能修改文件輸入元素,那麼我想旋轉圖像服務器端。我不知道它是否被認爲是一個錯誤,但如果您在iOS(iPhone或iPad)中使用相機拍攝照片,則當圖像在輸入類型=文件控制中返回到Web應用程序時,圖像出現旋轉。這不是iOS 7中已解決的圖像子採樣問題。是的,iOS中的Safari將方向標記考慮在內,但它不僅僅是Safari中的問題,因爲當圖像上傳到服務器時,它也是不正確的定位在那裏。 –

回答

1

問題如下得到解決。以下是我創建的VB.Net代碼,用於更改圖像方向服務器端,並且完美地工作。基本上它會自動糾正任何圖像,將其旋轉到正確的方向,使其顯示正確:

Public Function TestRotate(sImageFilePath As String) As Boolean 
    Dim rft As RotateFlipType = RotateFlipType.RotateNoneFlipNone 
    Dim img As Bitmap = Image.FromFile(sImageFilePath) 
    Dim properties As PropertyItem() = img.PropertyItems 
    Dim bReturn As Boolean = False 
    For Each p As PropertyItem In properties 
     If p.Id = 274 Then 
     Dim orientation As Short = BitConverter.ToInt16(p.Value, 0) 
     Select Case orientation 
      Case 1 
      rft = RotateFlipType.RotateNoneFlipNone 
      Case 3 
      rft = RotateFlipType.Rotate180FlipNone 
      Case 6 
      rft = RotateFlipType.Rotate90FlipNone 
      Case 8 
      rft = RotateFlipType.Rotate270FlipNone 
     End Select 
     End If 
    Next 
    If rft <> RotateFlipType.RotateNoneFlipNone Then 
     img.RotateFlip(rft) 
     System.IO.File.Delete(sImageFilePath) 
     img.Save(sImageFilePath, System.Drawing.Imaging.ImageFormat.Jpeg) 
     bReturn = True 
    End If 
    Return bReturn 

    End Function