2012-08-13 36 views
4

如果JPEG圖像僅從二進制文件中旋轉(如File.ReadAllBytes()的結果),您能否告訴我們(假設使用.NET 4.0,WinForms)?是否有可能知道JPEG圖像是否僅從其原始字節進行旋轉?

UPDATE


謝謝大家對你的答案爲止。

只是爲任何試圖解決同樣問題的人單挑。我被System.Drawing.Image類欺騙,該類在用FromFile(...)初始化時加載EXIF標籤,但似乎在從流初始化時忽略它們。我正在使用ExifTagCollection庫來讀取EXIF標籤,但我想結果可以與任何其他庫相媲美。

var bytes = (get binary from server) 
File.WriteAllBytes(path, bytes); 

WORKS

var image = Image.FromFile(path); 

不起作用:(失敗的FileStream太)

using (var ms = new MemoryStream(bytes)) 
{ 
    image = Image.FromStream(ms); 
} 

繼續:

ExifTagCollection exif = new ExifTagCollection(image); 
foreach (ExifTag tag in exif) 
{ 
    Console.WriteLine(tag.ToString()); 
} 

如果從流中加載,則沒有標記。

+0

您是否有原始參考圖像? – 2012-08-13 10:28:11

+0

我將使用手機攝像頭拍攝的圖像上傳到服務器。其中一些採用肖像模式,一些採用橫向模式。我很想知道是否有可能讓這個信息服務器端基於上傳的二進制文件。 – 2012-08-13 10:31:22

+2

你可以比較寬度和高度? – 2012-08-13 10:45:28

回答

4

http://jpegclub.org/exif_orientation.html詳細說明exif方向標誌。找到那個,找到方向。

當然,這隻適用於通過設置該標誌來旋轉圖像,這通常是由相機本身完成的,一些圖像瀏覽軟件不是爲更詳細的編輯而設計的,還有一些直接從屏幕開始,文件管理器工具。如果有人將圖像加載到更通用的圖像編輯器中,將其轉換並保存,它將不起作用。

編輯:

橫向與縱向是不同的,以「從圖像的設備自然定向旋轉」。它也更簡單:

if(img.Height == img.Width) 
    return MyAspectEnum.Square; 
if(img.Height > img.Width) 
    return MyAspectEnum.Portrait; 
return MyAspectEnum.Landscape; 

這可能更接近你真正想知道的。

1

如果您知道如何讀取JPEG編碼數據,您可以查找EXIF並從EXIF獲取旋轉。如果EXIF數據不可用,那將很困難。

2

如果EXIF數據不可用/不可靠的,你可能會認爲這個標識圖片格式:

  • 高度>寬度?人像格式
  • 寬度>高度?景觀格式
  • 寬度=高度?圖片是完全正方形的,任何一個都沒問題

與EXIF一樣的限制適用:對照片進行物理編輯並且未更新/設置EXIF信息也會欺騙此檢查。

相關問題