Resim Pixeli Analiz Ederken Yavaşlık..

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Resim Pixeli Analiz Ederken Yavaşlık..

Mesaj gönderen mrmarman »

Örneklerinizden anladığım Image içeriğiniz 8 bitlik renk derinliğine sahip. Muhtemelen siz renk derinliğini başlangıçta belirtmeyi unutmuşsunuz. Resim ile işlem yapmadan önce çalışma sınırlarınızı belirlemeniz lazım gelir.

Size gönderdiğim örnekte

Kod: Tümünü seç

  Image1.Picture.Bitmap.PixelFormat := pf8Bit;
şeklinde bir ifade görmüş olmanız lazım. Bunu deşifre işleminden önce uygulayınız. Böylece iki tane ok vb. görmezsiniz.

Şunu unutmadan ekleyim, scanline ile daha alt seviyede resim özelliklerine ulaşırsınız. İki tane ok görmenizin sebebi, 16 veya 32 bitlik derinlikte işlem yaptığınızı gösteriyor. Projenizde bu derinliği pf8Bit ile sınırlayın. Daha fazlasına ihtiyacınızın olup olmadığını resminizin renk çeşitliliğine bakarak değerlendiriniz.

Kodunuza daha önce belirttiğim satırı eklerken hata yapmış olmalısınız. Bir satır daha ekledim. Bu da size tanımlanmamış bir renkle karşılaşırsanız onu da ekleyecek şekilde size kodunu döndüren bir mesaj penceresi.

Kod: Tümünü seç

if RenkKodu = '.' then showmessagefmt('%x', [Okunan[j]]);

Kod: Tümünü seç

procedure TForm1.BitBtn3Click(Sender: TObject);
Var
  Okunan : pByteArray;
  i, j     : Integer;
  RenkKodu : Char;
  Satir    : String;
begin
  i := 0;
  j := 0;
  Memo2.Lines.Clear;
  Application.ProcessMessages;
  while i < 32 do begin
    Okunan := pByteArray( Image1.Picture.Bitmap.Scanline[i] );
    Satir := '';
    while j < 32 do begin
      RenkKodu := '.';
      case Okunan[j] of
      $F9 : RenkKodu := 'R';
      $FB : RenkKodu := 'Y';
      $00 : RenkKodu := 'B';
      $FA : RenkKodu := 'G';
      end;
      if RenkKodu = '.' then showmessagefmt('%x', [Okunan[j]]);
      
      Satir := Satir + RenkKodu;
      inc(j);
    end;
    Memo2.Lines.Add(Satir);
    j := 0;
    inc(i);
  end;
end;
Resim
Resim ....Resim
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Resim Pixeli Analiz Ederken Yavaşlık..

Mesaj gönderen Lost Soul »

Scanline değeri ile okuma yaparken resmin biçimini bilmeniz gerekir.
Yani Mono, 8bit, 16bit, 24bit renklerinden hangisini kullandığını bilmelisiniz veya okuduğunuz bütün resimleri ilk önce
kendi yorumlayacağını formata önüştürmelisiniz.
Eğer 16 bitlik resmi 8 bit gibi yorumlamaya çalışırsanız verdiğinize benzer şekilde çift şekil (hatta 4 şekil :) ) veya
en boy oranı alakasız değerlerle karşılaşırsınız
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

Re: Resim Pixeli Analiz Ederken Yavaşlık..

Mesaj gönderen neu84 »

Lost Soul yazdı:Scanline değeri ile okuma yaparken resmin biçimini bilmeniz gerekir.
Yani Mono, 8bit, 16bit, 24bit renklerinden hangisini kullandığını bilmelisiniz veya okuduğunuz bütün resimleri ilk önce
kendi yorumlayacağını formata önüştürmelisiniz.
Eğer 16 bitlik resmi 8 bit gibi yorumlamaya çalışırsanız verdiğinize benzer şekilde çift şekil (hatta 4 şekil :) ) veya
en boy oranı alakasız değerlerle karşılaşırsınız
Tşk ederim.. Peki ben resimlerimin Mono, 8bit, 16bit, 24bit olup olmadıgını nasıl ögrenebilirim.. ve Mono, 8bit, 16bit, 24bit e nasıl çevirebilirim? bi yolu var mı?
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Resim Pixeli Analiz Ederken Yavaşlık..

Mesaj gönderen Lost Soul »

neu84 yazdı: Tşk ederim.. Peki ben resimlerimin Mono, 8bit, 16bit, 24bit olup olmadıgını nasıl ögrenebilirim.. ve Mono, 8bit, 16bit, 24bit e nasıl çevirebilirim? bi yolu var mı?
Muharrem Hocam benden önce cevabı size vermiş zaten.

Kod: Tümünü seç

Image1.Picture.Bitmap.PixelFormat := pf8Bit;
yukarıdaki metoddan pixel formatını öğrenebilir veya değiştirebilirsiniz.
alabileceği veya dönüş değerleri.

Kod: Tümünü seç

pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom;
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

Re: Resim Pixeli Analiz Ederken Yavaşlık..

Mesaj gönderen neu84 »

mrmarman
Image1.Picture.Bitmap.PixelFormat := pf8Bit;
Sizin verdiginiz bu satır ekli ancak siyah renk dışında hiç bir rengi görmüyor. siyah için B, diger renkler için . koyuyo. Birde photshopta deniyim dedim 8 bit e dönüştürebilecekmiyim diye. aynı resmi yeni bi 8bit lik photoshop çalışması açarak yapıştırdım. bmp olarak kaydederken 1,4 ve 8 bit seçenekleri kapalıydı. sadece 16,24 ve 32bit vardı, ben 16 yı seçtim. o şekilde denedim aşagıdaki sonucu verdi, resmin yarısını gösterdi, ama sadece siyah bölgelere harf verdi, digerleri nokta.. PixelFormat a hem 8bit, hemde 16bit denedim ayrı ayrı ancak aynı sonucu verdi. :cry: :cry:

BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.
BBBBBBBBBBBBBBBBBBBBBBBBBBBBB.B.
BBBBBBBBBBBBBBBBBBBBBBBBBBB.B.B.
BBBBBBBBBBBBBBBBBBBBBBBBBBB.B.B.
BBBBBBBBBBBBBBBBBBBBBBBBB.B.B.BB
BBBBBBBBBBBBBBBBBBBBBBBBB.B.B.BB
BBBBBBBBBBBBBBBBBBBBBBB.B.B.BBBB
BBBBBBBBBBBBBBBBBBBBBBB.B.B.BBBB
BBBBBBBBBBBBBBBBBBBBB.B.B.BBBBBB
BBBBBBBBBBBBBBBBBBBBB.B.B.BBBBBB
BBBBBBBBBBBBBBBBBBB.B.B.BBBBBBBB
BBBBBBBBBBBBBBBBB.B.B.BBBBBBBBBB
BBBBBBBBBBBBBBBBB.B.B.BBBBBBBBBB
BBBBBBBBBBBBBBB.B.B.BBBBBBBBBBBB
BBBBBBBBBBBBBBB.B.B.BBBBBBBBBBBB
BBBBBBBBBBBBB.B.B.BBBB......BBBB
BBBBBBBBBBBBB.B.B.BB............
BBBBBBBBBBB.B.B.BBBB............
BBBBBBBBBBB.B.B.BBBB......BB....
BBBBBBBBB.B.B.BBBBBB......BBBBBB
BBBBBBB.B.B.BBBBBBBB......BBBBBB
BBBBBBB.B.B.BBBBBBBB......BBBBBB
BBBBB.B.B.BBBBBBBBBB......BBBBBB
BBBBB.B.B.BBBBBBBBBB......BBBBBB
BBB.B.B.BBBBBBBBBBBBBB..BBBBBBBB
BBB.B.B.BBBBBBBBBBBBBBBBBBBBBBBB
B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.
B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.B.
BBB.B.B.B.B.B.B.B.B.B.B.B.B.B.B.
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Resim Pixeli Analiz Ederken Yavaşlık..

Mesaj gönderen Lost Soul »

Şu metod işinizi görecektir. Aslında Muharrem beyle aynı kod bir kaç küçük değişiklik.
İstediğiniz pixel türünde kullanabilirsiniz.
Ekteki dosyada farklı pixel formatlarda resimlerle berabr kaynak kodu vardır.

Kod: Tümünü seç

{
Bmp: TBitmap; 
NeededColors : array of TColor; : Hangi renkler aranacak
_toStrArray : array of AnsiString; :renklerin karşılığı ne olacak
_strDefault: AnsiString; : Belirtilen renkler dışındaki renklerin karşılığı ne olacak
List: TStrings : Sonuç nireye yazılacak
NeededColors = []olursa renklerin HEX karşılığını yazar.
}
Procedure GenMap(Bmp: TBitmap; NeededColors : array of TColor; _toStrArray : array of AnsiString; _strDefault: AnsiString; List: TStrings);
CONST
  PixelCountMax = 32768;
TYPE
  pRGBTripleArray = ^TRGBTripleArray;
  TRGBTripleArray = ARRAY [0 .. PixelCountMax - 1] OF TRGBTriple;
VAR
  i,j,k: Integer;
  b: Boolean;
  RowIn: pRGBTripleArray; // pByteArray;
  Cl: TColor;
  aLine : AnsiString;
  bm : TBitmap;
begin
  bm := TBitmap.Create;
  bm.Width := Bmp.Width;
  bm.Height := bmp.Height;
  bm.Assign(bmp);
  Bm.PixelFormat := pf24bit;
  List.Clear;
  try
    FOR j := 0 TO Bm.Height - 1 DO
    Begin
      RowIn := Bm.Scanline[j];
      i := 0;
      aLine := '';
      while i <= Bm.Width - (1) do
      Begin
        Cl := RGB(RowIn[i].rgbtRed, RowIn[i].rgbtGreen, RowIn[i].rgbtBlue);
        if Length(NeededColors)>0 then
        Begin
          b:=false;
          for k := Low(NeededColors) to High(NeededColors) do
          Begin
            if NeededColors[k] = Cl then
            Begin
              aLine := aLine + _toStrArray[k];
              b:=True;
              Break;
            End;
          End;
          if not b then aLine := aLine + _strDefault;
        End
        else
          aLine := aLine + IntToHex(Cl,6);
        inc(i, 1);
      End;
      List.Add(aLine);
    end;
  finally
    bm.Free;
  End;
End;

Kullanımı

Kod: Tümünü seç

GenMap(Image1.Picture.Bitmap,[clBlack,clRed,clGreen,clBlue,clLime,clYellow],['B','R','G','B','L','Y'],'.',Memo1.Lines);

//veya sizin istediğiniz

GenMap(Image1.Picture.Bitmap,[clRed,clYellow,clBlack,clLime],['R','Y','B','L'],'.',Memo1.Lines);

// veya verilen renklerin dışındaki renkleri de B yapmak için
GenMap(Image1.Picture.Bitmap,[clRed,clYellow,clBlack,clLime],['R','Y','B','L'],'B',Memo1.Lines);
Örnek Program
colormap.rar
Örnek program
(59 KiB) 114 kere indirildi
PRogram Çıktısı
Resim

ayrıca scanline hakkında küçük bir açıklamayı sorduğunuz bu başlıkta bulabilirsiniz.
Kolay gelsin.
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

Re: Resim Pixeli Analiz Ederken Yavaşlık..

Mesaj gönderen neu84 »

Lost Soul yazdı:Şu metod işinizi görecektir. Aslında Muharrem beyle aynı kod bir kaç küçük değişiklik.
İstediğiniz pixel türünde kullanabilirsiniz.
Ekteki dosyada farklı pixel formatlarda resimlerle berabr kaynak kodu vardır.
ayrıca scanline hakkında küçük bir açıklamayı sorduğunuz bu başlıkta bulabilirsiniz.
Kolay gelsin.
Çok teşekkür ederim, Verdiginiz kodu inceleyip anlamaya çalışıcam, açıkçası bana biraz agır geliyo bu tür kodlamalar. :oops: .. inş bende bir gün ögrenicem bu tür kodlamaları.. Ünivde hep aynı kodları, fonksiyonları kullandırıyolardı, biraz karmaşık bi fonksiyon yada algoritma gördügümde donuklaşıyorum, inş bu da geçer 8)
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

Re: Resim Pixeli Analiz Ederken Yavaşlık..

Mesaj gönderen neu84 »

Arkadaşlar hepinize yardımlarınızdan dolayı ayrı ayrı teşekkür ederim.. Verdiginiz her bilgi çok işime yaradı çok sagolun. Ancak scanline'ı henüz tam olarak oturtamadım. Ancak biraz daha uğraşarak verdiginiz bilgiler sayesinde zamanla oturacagına inanıyorum.. Çok teşekkür ederim hepinize.. :bravo: :bravo: :bravo:
( bu başka soru sormayacagım anlamına gelmiyo tabi =) :wink: )..

İyi Çalışmalar..
Kullanıcı avatarı
burak_489
Üye
Mesajlar: 31
Kayıt: 20 Ara 2010 09:20

Re: Resim Pixeli Analiz Ederken Yavaşlık..

Mesaj gönderen burak_489 »

...
En son burak_489 tarafından 12 Mar 2011 12:52 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

Re: Resim Pixeli Analiz Ederken Yavaşlık..

Mesaj gönderen neu84 »

burak_489 yazdı:
s.a.

renkodu b,m,r vs gibi bunlara gerek yok bana göre.zaten 1024*768 boyutunda bir resimdeki tüm pixellerin renk değerlerini hexadecimal olarak alıp sıkıştırdığınızda 150 kb civarı (lzma ile sıkıştırıldığında) alan kaplıyor olmalı.ki bu kalitede bir görüntü de hiç fena değil.yani kendin renk kodu vs vericem diye uğraşma hexadecimal olarak aldığında renk değerini işlemen daha kolay olur kendi renk formatına dönüştürmene gerek kalmaz.ayrıca işlerken de direk kullanırsın sıkışmış halini çıkarttığında.
umarım bişeyler anlatabilmişimdir.programında başarılar.
Çok Tşk ederim. tamda bugün böyle bişeyi düşündüm hex olarak alabilirmiyim diye, ama nasıl alabilirim onu bilemedigim için çıktı gitti aklımdan.. :) Bi bakarım denerim yapmayı, yapamazsam bi slm atarım :)
Kullanıcı avatarı
burak_489
Üye
Mesajlar: 31
Kayıt: 20 Ara 2010 09:20

Re: Resim Pixeli Analiz Ederken Yavaşlık..

Mesaj gönderen burak_489 »

...
En son burak_489 tarafından 12 Mar 2011 01:03 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

Re: Resim Pixeli Analiz Ederken Yavaşlık..

Mesaj gönderen neu84 »

burak_489 yazdı:IntToHex fonsiyonu var her renk aslında bir sayıya eşit diye biliyorum.Bunu kullanabilirsin sanırım .
Tşk ederim adaş.
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

Re: Resim Pixeli Analiz Ederken Yavaşlık..

Mesaj gönderen neu84 »

@burak_489
bir resimdeki tüm pixellerin renk değerlerini hexadecimal olarak alıp sıkıştırdığınızda 150 kb civarı (lzma ile sıkıştırıldığında) alan kaplıyor olmalı.
Burak hex aldıktan sonra sıkıştırma derken neyi kastediyoun anlamadım, nasıl sıkıştırma yani, nasıl oluyor o? Ve imza derken?? Aydınlatırsan sevirimm..

800x600 pixellik bir foto analiz ettim ve bi txt dosyasına aktardım. 5.56MB lık bi boyutu oldu dosyanın. Bu işimi çok zorlaştırır, hani demiştinya 150kb olur diye, o şekilde elde etmenin bi yolu var mı? Yada Daha az bi boyut elde edilebilirmi?

2 For Döngüsü içinde,
Kodlar:=Kodlar+(IntToHex(Image1.Picture.Bitmap.Canvas.Pixels[X,Y],0)); Bu kodu kullanıyorum. Ve bittik sonra Txt e kaydediyorum.
Cevapla