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;
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. –