Jpeg and Tiff have Exif (pluggable image file format) that determine the orientation of the image (among other data).
It's not that "TImage rotates my image." TImage does not process Exif orientation metadata. Ideally, TImage should automatically rotate the image according to the orientation metadata, but this is not the case. You need to read the Exif orientation property and rotate the image accordingly.
Exif tag "Orientation" (0x0112):
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
You can use some free Exif components like TExif / NativeJpg / CCR Exif and, if necessary, rotate the image according to the orientation tag.
Here is an example of using GDI + (VCL / Windows), for example:
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;
kobik source share