编写移动应用程序 - 它从安全网站中提取图像,并在下面显示(第一张图像)拉不正确(注意网页版本与移动版本),第二张图片在网站上正确显示,但Delphi TImage正在旋转它由于某种原因,我无法弄清楚为什么。旋转设置为0,并在TImage组件上设置“适合”。
思想?
答案 0 :(得分:7)
Exif规范定义了一个方向标记,用于指示摄像机相对于捕获场景的方向。因此,某些应用可以自动旋转与此EXIF标志对应的图像。我猜你的网络版本会自动旋转。 TImage不这样做。
答案 1 :(得分:5)
Jpeg和Tiff有Exif(可交换图像文件格式)元数据,用于指定图像方向(以及其他数据)。
这不是“TImage旋转我的形象”。 TImage不处理Exif方向元数据。理想情况下,TImage 应根据方向元数据自动旋转图像,但事实并非如此。您需要阅读Exif方向属性并相应地旋转图像。
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
你可以使用一些免费的Exif components 这样的TExif / NativeJpg / CCR Exif,根据方向标记,根据需要旋转图像。
以下是使用GDI +(VCL / Windows)的示例,例如:
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;
答案 2 :(得分:2)
网站肯定会读取图片的exif数据,其中包含照片的方向,然后相应地旋转图像。 德尔福没有。 您必须为此读取图片元数据(在Google上搜索“exif”)
答案 3 :(得分:0)
谢谢大家。
不是编程解决方案,但为我工作....
我使用免费的InfranView图像处理软件来检查图像,并关闭读取的EXIF数据,这些数据显示我的图像旋转不正确。我改变了,重新保存了文件并更新了网站。