2015-01-08 5 views
7

mający problemy w uzyskaniu orientacji obrazu z poniższym kodzieuzyskać orientację obrazu i obracać zgodnie z orientacją

string fileName = @"D:\...\...\01012015004435.jpeg"; 

    int rotate = 0; 
    using (var image = System.Drawing.Image.FromFile(fileName)) 
    { 
     foreach (var prop in image.PropertyItems) 
     { 
      if (prop.Id == 0x112) 
      { 
       if (prop.Value[0] == 6) 
        rotate = 90; 
       if (prop.Value[0] == 8) 
        rotate = -90; 
       if (prop.Value[0] == 3) 
        rotate = 180; 
       prop.Value[0] = 1; 
      } 
     } 
    } 

i po uzyskać właściwą orientację i służą do obracania obrazu jak

private static RotateFlipType OrientationToFlipType(string orientation) 
{ 
    switch (int.Parse(orientation)) 
    { 
     case 1: 
      return RotateFlipType.RotateNoneFlipNone; 
      break; 
     case 2: 
      return RotateFlipType.RotateNoneFlipX; 
      break; 
     case 3: 
      return RotateFlipType.Rotate180FlipNone; 
      break; 
     case 4: 
      return RotateFlipType.Rotate180FlipX; 
      break; 
     case 5: 
      return RotateFlipType.Rotate90FlipX; 
      break; 
     case 6: 
      return RotateFlipType.Rotate90FlipNone; 
      break; 
     case 7: 
      return RotateFlipType.Rotate270FlipX; 
      break; 
     case 8: 
      return RotateFlipType.Rotate270FlipNone; 
      break; 
     default: 
      return RotateFlipType.RotateNoneFlipNone; 
    } 
} 

ale problem jest w pierwszym kod

prop.Id Zawsze otrzymuję [20625]

prop.Id == 20625 

więc nie spełniają warunek za każdym razem Proszę dać mi znać, jeśli jakikolwiek błąd lub inna opcja

dzięki

+0

Czy oglądane zdjęcia określają ich orientację? Nie jestem pewien, czy jest to właściwość ustawiona domyślnie (tj. Jaka może być domyślna orientacja twojego gravatar?) – Sayse

+0

Zamiast sprawdzać każdy obraz 'PropertyItem', powinieneś po prostu zapytać o ten, który chcesz, np. 'image.GetPropertyItem (0x112);'. Jeśli właściwość obrotu nie jest obecna, rzuci wyjątek (który można przechwycić i obsłużyć). Nie wszystkie pliki obrazów będą miały właściwość obrotu. Zauważ także, że wartość 'PropertyItem.Type' powinna wynosić 3 (16-bitowe liczby całkowite), a wartość' Len' powinna wynosić co najmniej 2. Podczas gdy kod, który powinieneś, powinien działać, IMHO jest bardziej poprawne i użyj 'BitConverter ', aby przekonwertować pierwsze dwa bajty w tablicy' Wartość' na 'Int16', w przypadku jakiejś dziwnej wartości> 255. –

+0

Cześć dzięki za odpowiedź, faktycznie jestem dostawcą usług i usługą sieciową w serwisie wcf. Android i programista ios wysłał mi obraz i jak na obrazek muszę obrócić lub przyciąć. więc muszą ustawić właściwość obrazu? –

Odpowiedz

0

Można użyć tego linku http://regex.info/exif.cgi zbadać swój obraz osadzony metadanych. Jeśli nie znajdziesz "0x0112" w tabeli EXIF, obraz nie zawiera właściwości rotacji.

3

użyć następujących:

  • img.PropertyIdList.Contains(orientationId) aby sprawdzić, czy tag EXIF ​​jest obecny.
  • img.GetPropertyItem(orientationId), aby go uzyskać (po powyższej kontroli, w przeciwnym razie otrzymasz numer ArgumentException).
  • img.SetPropertyItem(pItem), aby go ustawić.

Napisałem prostą klasę pomocy, która robi wszystko: możesz sprawdzić full source code here.

Informacja i szybkie case-study dostępny jest również tutaj:

Change image orientation for iPhone and/or Android pics in NET C#

2

Nie ma chyba wystarczająco dużo informacji w innych odpowiedzi i komentarze, aby umieścić to wszystko razem, ale oto przykładowy kod działa.

Ta metoda rozszerzeń zajmie System.DrawingImage, odczyta jej znacznik Exif Orientation (jeśli istnieje) i odwróci/obróci (jeśli to konieczne).

private const int exifOrientationID = 0x112 //274 

public static void ExifRotate(this Image img) 
{ 
    if (!img.PropertyIdList.Contains(exifOrientationID)) 
     return; 

    var prop = img.GetPropertyItem(exifOrientationID); 
    int val = BitConverter.ToUInt16(prop.Value, 0); 
    var rot = RotateFlipType.RotateNoneFlipNone; 

    if (val == 3 || val == 4) 
     rot = RotateFlipType.Rotate180FlipNone; 
    else if (val == 5 || val == 6) 
     rot = RotateFlipType.Rotate90FlipNone; 
    else if (val == 7 || val == 8) 
     rot = RotateFlipType.Rotate270FlipNone; 

    if (val == 2 || val == 4 || val == 5 || val == 7) 
     rot |= RotateFlipType.RotateNoneFlipX; 

    if (rot != RotateFlipType.RotateNoneFlipNone) 
     img.RotateFlip(rot); 
} 
Powiązane problemy