2017-01-12 23 views
6

bir mobil uygulama yazma - güvenli bir web sitesinden görüntü çekerek ve (mobil versiyonu vs ihbar web versiyonu) (ilk resim) yanlış çeker aşağıda gösterilen, ikinci görüntü web sitesinde doğru gösterir, ancak Delphi TImage için dönerken bir sebep ve nedenini anlayamıyorum. Döndürme 0'a ayarlanır ve TImage bileşeninde "Fit" ayarlanır.Neden TImage resmimi döndürüyor?

Düşünceler?

enter image description here

Why does it rotate like this

+0

bu bile Windows Explorer her zaman olur bkz:

İşte GDI + (VCL/Windows) kullanarak bir örnek örn olduğunu. Oldukça emin resmin kendisi, bayraklar, "döndürülmüş" olarak ya da bu doğrultuda bir dosyayı şey ile ilgisi vardır. –

cevap

2

Web sitesi kesinlikle fotoğrafın yönünü içerir ve bunlara göre görüntüyü döndürmek resmin exif verileri okumak. Delphi bunu yapmaz. Bunun için resim meta okumak

7

Exif şartname yakalanan olay yerine kamera oriyantasyonunu belirtmek için bir Yönlendirme Etiketi tanımlar (google "exif" arama) gerekmektedir. Bazı uygulamalar bu nedenle bu EXIF-Flag'a karşılık gelen görüntüyü otomatik olarak döndürebilir. Web sürümünüzün bunu otomatik olarak döndürdüğünü tahmin ediyorum. TImage bunu yapmaz. Tüm

0

teşekkürler.

Değil programlama çözüm, ama benim için çalıştı ....

Ben görüntüleri incelemek için ücretsiz InfranView görüntü işleme yazılımı kullandım ve bana yanlış döndürüldü görüntüleri gösterdi okuma EXIF ​​verilerini kapalı . Dosyaları değiştirdim ve yeniden kaydettim ve web sitesini güncelledim.

+2

Sunucu görüntülerini denetlemezseniz ne olur? Gerçekten yapmanız gereken şey Exif yönelim özelliğini okumak ve görüntüyü buna göre döndürmektir. – kobik

5

JPEG ve TIFF (başka verilerle birlikte) görüntü yönünü belirtmek Exif (Değiştirilebilir görüntü dosya biçimi) meta veriler.

O "TImage Resmimi dönen" değil. TImage, Exif yönelim meta verilerini işlemiyor. İdeal olarak, TImage oryantasyon meta verilerine göre görüntüyü otomatik döndürmek gerekir, ancak öyle değil. Exif yönelim özelliğini okumalı ve resmi buna göre döndürmelisiniz.

Exif tag "Oryantasyon" (0x0112) spec:

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 

Bazı ücretsiz Exif components böyle TExif/NativeJpg/CCR Exif kullanabilir ve oryantasyon etiketine göre gerekirse görüntüyü döndürebilirsiniz.

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; 
İlgili konular