Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Exif-Rotation
#1
Exif diye arattım ama forumda pek bir şey bulamadım.
TakePhotoFromLibraryAction1DidFinishTaking ve fotoğraf çekme sonucunda elde ettiğim fotoğrafı bir TImage içerisinde gösteriyorum.

Ancak bazı fotoğraflar Exif bilgisi nedeniyle dönmüş olarak geliyor. Dikey bir fotoğraf yatay olarak görünüyor, ya da yatay bir fotoğraf dikey görünüyor.
Exif değerlerini okuyarak, bir fotoğrafın doğru bir şekilde görüntülenmesini nasıl sağlarım?
Cevapla
#2
Width Height değerleri portrait mode olunca küçük/büyük landscape olunca büyük/küçük olmuyor mu? Bir kontrol eder misiniz.

Çok uzağa gitmeden yakından dönmek en iyisi o bakımdan. Smile

EK bu arada nette buldum EXIF kodları şu şekildeymiş. 
bg2018081714.jpg
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#3
Standart olmuyor maalesef. İki tane dikey fotoğraf var diyelim. Birisini yan yatırıyor, diğerini normal ekliyor. Fotoğrafı çeken cihazın kamerasının bulunduğu konumu okuyup ona göre bir şeyler yazmam gerekiyor.
Cevapla
#4
Anlatmak istediğim o değildi.

JPG fotoğraf olduğunu varsayalım. Bunu bir TJpegImage nesnesine loadfromfile dediniz ve ardından Width / Height değerini okudunuz.

Bu okuduğunuz değer width : 720 height : 1280 ise dikey, Width 1280,height 720 ise yatay manasına geliyor ya o bakımdan. Bunu sorgulayarak dikey / yatay anlamı çıkabilir mi diye sorunuzu genişletmek istedim 

Diğer yandan EK olarak verdiğim resimde sadece dikey veya yatay değil makineyi ters tutarak çekildiği de söz konusu olduğunu hatırladım.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#5
(17-09-2018, Saat: 21:48)mrmarman Adlı Kullanıcıdan Alıntı: Anlatmak istediğim o değildi.

JPG fotoğraf olduğunu varsayalım. Bunu bir TJpegImage nesnesine loadfromfile dediniz ve ardından Width / Height değerini okudunuz.

Bu okuduğunuz değer width : 720 height : 1280 ise dikey, Width 1280,height 720 ise yatay manasına geliyor ya o bakımdan. Bunu sorgulayarak dikey / yatay anlamı çıkabilir mi diye sorunuzu genişletmek istedim 

Diğer yandan EK olarak verdiğim resimde sadece dikey veya yatay değil makineyi ters tutarak çekildiği de söz konusu olduğunu hatırladım.
İşte kameranın konumuna göre yükseklik genişlik değeri değişiyor. Elimde bir resim var örneğin. Resim detaylarında Genişlik 5312, Yükseklik 2992 yazıyor. Ama bu dikey bir resim. Yatay değil. Kamera konumuna göre yatay-dikey kavramları değişiyor. Sıkıntı burada. Keşke sizin dediğiniz gibi kolay olabilseydi.
Cevapla
#6
Bu foto örneği width/height bilgisini sizin projeniz mi gördü?
Bu foto örneği bir foto editör dikey foto olarak algılıyor mu? 

Yatay olarak algılıyor ise zaten EXIF değeri de yanlış kodlanmış demek olacaktır. Bunu netleştirince EXIF okuma işlemi kaçınılmaz olacaktır.

BINARY dosya okumaya ve JPEG Dosya structure type için kolları sıvamak demektir bu ki sizi bundan kurtarmak idi amaç.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#7
(17-09-2018, Saat: 22:21)mrmarman Adlı Kullanıcıdan Alıntı: Bu foto örneği width/height bilgisini sizin projeniz mi gördü?
Bu foto örneği bir foto editör dikey foto olarak algılıyor mu? 

Yatay olarak algılıyor ise zaten EXIF değeri de yanlış kodlanmış demek olacaktır. Bunu netleştirince EXIF okuma işlemi kaçınılmaz olacaktır.

BINARY dosya okumaya ve JPEG Dosya structure type için kolları sıvamak demektir bu ki sizi bundan kurtarmak idi amaç.

Androidin albüm uygulaması ile açtığımda dikey olarak gösteriyor. Resim zaten dikey. Burada detay bilgilerine baktığımda ekteki bilgileri veriyor.

Resim gösterme ile ilgili uygulama yazan herkesin bu sorunu yaşayacağı aşikar. Tabletde başka, telefonda başka sonuçlar çıkacak çünkü.

Resimleri buraya eklerken küçültmek zorunda kaldım. İzin vermedi çünkü orijinal boyutlara.


Ek Dosyalar Resimler
       
Cevapla
#8
Açıklama için teşekkürler.
Yarın fırsat bulursam bir örnek hazırlarım  Sonuçta FileStream okuma işlemi.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#9
İçerisinde telefonumla çektiğim örnek (4) foto da mevcut
Benzeri şekilde bir çözüm üreteceksiniz.

lyir77jyww8uhahg7ayv.png

Uses JPEG;

Type tFotoEXIF = Record
 aWidth, aHeight : Integer;
 aFotoYonuKodu   : Integer;
End;
function FotoBilgileri( Foto: TPicture; FotoFileName:String ): tFotoEXIF;
Var
 aFS   : TFileStream;
 aByte : Byte;
begin
 Foto.LoadFromFile( FotoFileName );
 Result.aWidth        := Foto.Width;
 Result.aHeight       := Foto.Height;
 aFS := TFileStream.Create( FotoFileName, fmOpenRead or fmShareDenyNone );
   // 36hex offset'de
   aFS.Seek( StrToInt('$36'), soBeginning );
   aFS.ReadBuffer( aByte, SizeOf(Byte));
 aFS.Free;
 Result.aFotoYonuKodu := Integer(aByte);
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
 aFotoBilgi : tFotoEXIF;
begin
 if ListBox1.ItemIndex = -1 then exit;

 aFotoBilgi := FotoBilgileri( Image1.Picture, '.\Foto(s)\' + ListBox1.Items[ListBox1.ItemIndex] );

 Memo1.Lines.Add( StringOfChar( '-', 80 ) );
 Memo1.Lines.Add( Format(' Çözünürlük : %d x %d', [ aFotoBilgi.aWidth, aFotoBilgi.aHeight ]) );
 case aFotoBilgi.aFotoYonuKodu of
 01: Memo1.Lines.Add('Yatay - Telefon Düzgün');
 06: Memo1.Lines.Add('Dikey - Telefon Düzgün');
 03: Memo1.Lines.Add('Yatay - Telefon Ters');
 08: Memo1.Lines.Add('Dikey - Telefon Ters');
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Image1.AutoSize     := False;
 Image1.Stretch      := True;
 Image1.Proportional := True;

 Memo1.WordWrap      := False;
 Memo1.ScrollBars    := ssBoth;
end;

Örnek Foto ve Kaynak Kod içeren Proje Linki buradadır indirebilirsiniz.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#10
Örneği VLC tabanlı yapmışsınız, firemonkey e uyarlayamadım ama fikir ve emeğiniz için teşekkürler.
Uyarlayıp çalıştırabilirsem kodları buraya eklerim...
Cevapla




Konuyu Okuyanlar: 1 Ziyaretçi