2017-01-12 13 views
6

모바일 응용 프로그램 작성 - 보안 웹 사이트에서 이미지를 가져오고 아래 (첫 번째 이미지)가 잘못 당겨지며 (웹 버전과 모바일 버전의 통보), 두 번째 이미지는 웹 사이트에 올바르게 표시되지만 Delphi TImage는 왠지 이유가 무엇인지 모르겠다. Rotate가 0으로 설정되고 "Fit"이 TImage 구성 요소에 설정됩니다.왜 TImage가 내 이미지를 회전시키고 있습니까?

생각하십니까?

enter image description here

Why does it rotate like this

+0

난이도 Windows 탐색기에서 모든 시간을 일 참조 :

여기 GDI + (VCL/Windows)를 사용하는 예제 예컨대입니다. 확실히 이미지 자체와 관련이 있습니다. 즉, 파일을 "회전 된"것으로 플래그를 지정하거나 해당 라인을 따라 표시합니다. –

답변

2

웹 사이트 확실히 사진 방향을 포함하고, 그에 따라 이미지를 회전 사진의 EXIF ​​데이터를 읽는다. 델파이는 그렇지 않습니다. 해당 사진의 메타 데이터를 읽어야합니다 (Google의 "exif"검색)

7

Exif 사양은 촬영 된 장면을 기준으로 카메라의 방향을 나타내는 방향 태그를 정의합니다. 따라서 일부 앱은이 EXIF-Flag에 해당하는 이미지를 자동 회전 할 수 있습니다. 나는 당신의 웹 버전이 자동 회전을하는 것으로 추측한다. TImage는 그렇지 않습니다.

0

감사합니다.

아니 프로그래밍 솔루션,하지만 나를 위해 일한은 ....

나는 이미지를 검사하는 무료 InfranView 이미지 처리 소프트웨어를 사용하고, 나에게 잘못 회전 된 이미지를 보여 주었다 읽기 EXIF ​​데이터를 해제 . 변경하고 파일을 다시 저장하고 웹 사이트를 업데이트했습니다.

+2

서버 이미지를 제어하지 않으면 어떻게됩니까? 당신이 정말로해야 할 일은 Exif 방향 속성을 읽고 이에 따라 이미지를 회전시키는 것입니다. – kobik

5

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;