모바일 응용 프로그램 작성 - 보안 웹 사이트에서 이미지를 가져오고 아래 (첫 번째 이미지)가 잘못 당겨지며 (웹 버전과 모바일 버전의 통보), 두 번째 이미지는 웹 사이트에 올바르게 표시되지만 Delphi TImage는 왠지 이유가 무엇인지 모르겠다. Rotate가 0으로 설정되고 "Fit"이 TImage 구성 요소에 설정됩니다.왜 TImage가 내 이미지를 회전시키고 있습니까?
생각하십니까?
모바일 응용 프로그램 작성 - 보안 웹 사이트에서 이미지를 가져오고 아래 (첫 번째 이미지)가 잘못 당겨지며 (웹 버전과 모바일 버전의 통보), 두 번째 이미지는 웹 사이트에 올바르게 표시되지만 Delphi TImage는 왠지 이유가 무엇인지 모르겠다. Rotate가 0으로 설정되고 "Fit"이 TImage 구성 요소에 설정됩니다.왜 TImage가 내 이미지를 회전시키고 있습니까?
생각하십니까?
웹 사이트 확실히 사진 방향을 포함하고, 그에 따라 이미지를 회전 사진의 EXIF 데이터를 읽는다. 델파이는 그렇지 않습니다. 해당 사진의 메타 데이터를 읽어야합니다 (Google의 "exif"검색)
Exif 사양은 촬영 된 장면을 기준으로 카메라의 방향을 나타내는 방향 태그를 정의합니다. 따라서 일부 앱은이 EXIF-Flag에 해당하는 이미지를 자동 회전 할 수 있습니다. 나는 당신의 웹 버전이 자동 회전을하는 것으로 추측한다. TImage는 그렇지 않습니다.
감사합니다.
아니 프로그래밍 솔루션,하지만 나를 위해 일한은 ....
나는 이미지를 검사하는 무료 InfranView 이미지 처리 소프트웨어를 사용하고, 나에게 잘못 회전 된 이미지를 보여 주었다 읽기 EXIF 데이터를 해제 . 변경하고 파일을 다시 저장하고 웹 사이트를 업데이트했습니다.서버 이미지를 제어하지 않으면 어떻게됩니까? 당신이 정말로해야 할 일은 Exif 방향 속성을 읽고 이에 따라 이미지를 회전시키는 것입니다. – kobik
Jpeg 및 Tiff에는 이미지 방향 (다른 데이터 중에서)을 지정하는 Exif (교환 가능 이미지 파일 형식) 메타 데이터가 있습니다.
"내 이미지를 회전하는 TImage"가 아닙니다. TImage는 Exif 방향 메타 데이터를 처리하지 않습니다. 이상적으로 TImage 은은 방향 메타 데이터에 따라 이미지를 자동 회전해야하지만 그렇지 않습니다. Exif 방향 속성을 읽고 그에 따라 이미지를 회전해야합니다.
Exif tag "방향"(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를 사용하고, 방향 태그에 따라 필요한 경우 이미지를 회전 할 수 있습니다.
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;
난이도 Windows 탐색기에서 모든 시간을 일 참조 :
여기 GDI + (VCL/Windows)를 사용하는 예제 예컨대입니다. 확실히 이미지 자체와 관련이 있습니다. 즉, 파일을 "회전 된"것으로 플래그를 지정하거나 해당 라인을 따라 표시합니다. –