2017-01-12 6 views
6

Schreiben einer mobilen Anwendung - es zieht Bilder von einer sicheren Website, und unten gezeigt (das erste Bild) zieht falsch (beachten Sie Web-Version vs mobile Version), das zweite Bild zeigt korrekt auf der Website, aber Delphi TImage dreht es für Irgendein Grund und ich kann nicht herausfinden warum. Rotate wird auf 0 gesetzt und "Fit" wird in der TImage-Komponente festgelegt.Warum dreht TImage mein Bild?

Gedanken?

enter image description here

Why does it rotate like this

+0

ich dies auch die ganze Zeit im Windows Explorer passieren sehen. Ziemlich sicher, es hat etwas mit dem Bild selbst zu tun, etwas, das die Datei als "gedreht" markiert oder entlang dieser Linien. –

Antwort

2

Website sicherlich EXIF-Daten des Bildes lesen, die Ausrichtung des Fotos enthalten, und drehen Sie dann das Bild entsprechend. Delphi nicht. Sie müssen Bild Metadaten dafür lesen (Suche "Exif" bei Google)

7

Die Exif-Spezifikation definiert ein Orientierungstag, um die Ausrichtung der Kamera relativ zu der aufgenommenen Szene anzuzeigen. Einige Apps können daher das diesem EXIF-Flag entsprechende Bild automatisch drehen. Ich würde vermuten, dass sich deine Web-Version automatisch dreht. TImage tut es nicht.

0

Vielen Dank.

keine Programmierlösung, aber für mich gearbeitet ....

benutzen ich die freie InfranView Bildverarbeitungs-Software, um die Bilder zu untersuchen, und drehte die gelesenen EXIF-Daten aus, die mir die Bilder zeigten, die falsch gedreht wurden . Ich änderte und speicherte die Dateien erneut und aktualisierte die Website.

+2

Was passiert, wenn Sie die Serverbilder nicht kontrollieren? Was Sie wirklich tun müssen, ist die Exif-Orientierungseigenschaft zu lesen und das Bild entsprechend zu drehen. – kobik

5

Jpeg und Tiff haben Exif (austauschbares Bilddateiformat) Metadaten, die Bildausrichtung (neben anderen Daten) angeben.

Es ist nicht, dass "TImage mein Bild rotieren". TImage verarbeitet nicht die Metadaten der Exif-Ausrichtung. Im Idealfall sollte TImage das Bild automatisch nach den Metadaten der Ausrichtung drehen, tut dies aber nicht. Sie müssen die Exif-Ausrichtungseigenschaft lesen und das Bild entsprechend drehen.

Die Exif tag "Orientation" (0x0112) Spezifikation ist:

1 = Horizontal (normal) 
2 = Mirror horizontal 
3 = Rotate 180 
4 = Mirror vertical 
5 = Mirror horizontal and rotate 270 CW 
6 = Rotate 90 CW 
7 = Mirror horizontal and rotate 90 CW 
8 = Rotate 270 CW 

Sie einige freie Exif components solche TExif/NativeJpg/CCR Exif verwenden können, und das Bild drehen, wenn entsprechend der Ausrichtung Tag benötigt.

Hier ist ein Beispiel unter Verwendung von GDI + (VCL/Windows) z:

uses GDIPAPI, GDIPOBJ; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    GPImage: TGPImage; 
    GPGraphics: TGPGraphics; 
    pPropItem: PPropertyItem; 
    BufferSize: Cardinal; 
    Orientation: Byte; 
    RotateType: TRotateFlipType; 
    Bitmap: TBitmap; 
begin 
    GPImage := TGPImage.Create('D:\Test\image.jpg'); 
    try 
    BufferSize := GPImage.GetPropertyItemSize(PropertyTagOrientation); 
    if BufferSize > 0 then 
    begin 
     GetMem(pPropItem, BufferSize); 
     try 
     GDPImage.GetPropertyItem(PropertyTagOrientation, BufferSize, pPropItem); 
     Orientation := PByte(pPropItem.value)^; 
     case Orientation of 
      1: RotateType := RotateNoneFlipNone; // Horizontal - No rotation required 
      2: RotateType := RotateNoneFlipX; 
      3: RotateType := Rotate180FlipNone; 
      4: RotateType := Rotate180FlipX; 
      5: RotateType := Rotate90FlipX; 
      6: RotateType := Rotate90FlipNone; 
      7: RotateType := Rotate270FlipX; 
      8: RotateType := Rotate270FlipNone; 
     else 
      RotateType := RotateNoneFlipNone; // Unknown rotation? 
     end; 
     if RotateType <> RotateNoneFlipNone then 
      GPImage.RotateFlip(RotateType); 
     Bitmap := TBitmap.Create; 
     try 
      Bitmap.Width := GPImage.GetWidth; 
      Bitmap.Height := GPImage.GetHeight; 
      Bitmap.Canvas.Lock; 
      try 
      GPGraphics := TGPGraphics.Create(Bitmap.Canvas.Handle); 
      try 
       GPGraphics.DrawImage(GPImage, 0, 0, GPImage.GetWidth, GPImage.GetHeight); 
       Image1.Picture.Assign(Bitmap);    
      finally 
       GPGraphics.Free; 
      end; 
      finally 
      Bitmap.Canvas.Unlock; 
      end;  
     finally 
      Bitmap.Free; 
     end; 
     finally 
     FreeMem(pPropItem); 
     end; 
    end; 
    finally 
    GPImage.Free 
    end; 
end;