2017-01-12 27 views
6

Viết một ứng dụng di động - nó kéo hình ảnh từ một trang web an toàn, và hiển thị bên dưới (hình ảnh đầu tiên) kéo không chính xác (thông báo phiên bản web so với phiên bản di động), hình ảnh thứ hai hiển thị chính xác trên trang web, nhưng Delphi TImage đang xoay nó một số lý do và tôi không thể hiểu tại sao. Xoay được đặt thành 0 và "Fit" được đặt trên thành phần TImage.Tại sao TImage xoay hình ảnh của tôi?

Suy nghĩ?

enter image description here

Why does it rotate like this

+0

Tôi thấy điều này xảy ra tất cả các thời gian trong Windows Explorer chẵn. Khá chắc chắn nó có một cái gì đó để làm với hình ảnh chính nó, một cái gì đó mà cờ các tập tin như "xoay", hoặc dọc theo những dòng. –

Trả lời

2

trang web chắc chắn đọc dữ liệu Exif của bức tranh, có chứa định hướng của bức ảnh, và sau đó xoay hình ảnh cho phù hợp. Delphi thì không. Bạn phải đọc siêu dữ liệu hình ảnh cho điều đó (tìm kiếm "exif" trên google)

7

Đặc tả Exif xác định Thẻ định hướng để cho biết hướng của máy ảnh liên quan đến cảnh chụp. Do đó, một số ứng dụng có thể tự động xoay hình ảnh tương ứng với EXIF-Flag này. Tôi đoán rằng phiên bản web của bạn sẽ tự động xoay. TImage hiện nó không.

0

Cảm ơn tất cả.

Không phải là một giải pháp lập trình, nhưng làm việc cho tôi ....

tôi đã sử dụng phần mềm xử lý hình ảnh InfranView miễn phí để kiểm tra các hình ảnh, và tắt các dữ liệu đọc EXIF ​​mà chỉ cho tôi những hình ảnh đã được luân chuyển không đúng cách . Tôi đã thay đổi và lưu lại các tệp và cập nhật trang web.

+2

Nếu bạn không kiểm soát hình ảnh máy chủ thì sao? Những gì bạn thực sự cần làm là đọc thuộc tính định hướng Exif và xoay hình ảnh cho phù hợp. – kobik

5

Jpeg và Tiff có Exif (định dạng tệp hình ảnh có thể thay đổi) siêu dữ liệu chỉ định hướng hình ảnh (trong số các dữ liệu khác).

Nó không phải là "TImage xoay hình ảnh của tôi". TImage không xử lý siêu dữ liệu định hướng Exif. Lý tưởng nhất, TImage nên tự động xoay hình ảnh theo siêu dữ liệu định hướng, nhưng không. Bạn cần đọc thuộc tính định hướng Exif và xoay hình ảnh cho phù hợp.

Các Exif tag "Định hướng" (0x0112) spec là:

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 

Bạn có thể sử dụng một số miễn phí Exif components như TExif/NativeJpg/CCR Exif, và xoay hình ảnh của bạn nếu cần thiết theo thẻ hướng.

Dưới đây là một ví dụ sử dụng GDI + (VCL/Windows) ví dụ:

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; 
Các vấn đề liên quan