Resim Pixeli Analiz Ederken Yavaşlık..

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

Resim Pixeli Analiz Ederken Yavaşlık..

Mesaj gönderen neu84 »

Selam Arkadaşlar, Bi uygulamam var, bu uygulamada bi örnegin 100x100 pixellik bir resmin her pixelindeki rengi analiz ediyorum, ve döngü sonunda çıkan sonucu bi degişkene atıyorum. Bu işlemi yaparken bi sıkıntım yok, ancak bu konu diger uygulamama o oluşturgudum renkgrubuyla yeniden oluşturmak istedigimde yavaş yapıyor. Pixellerin dolduruluşunu görüyorum. Sizde sorun nerede olabilir? Algoritmamda da o kadar kasacak bişey yok,Resimlerde sadece 4 renk kullanılıyorancak yavaş ilerliyo..
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 »

Neden yavaş ilerlediğini sormuşsunu ama uyguladığınız kodu yazmayı unutmuşsunuz !? Neye dayanarak cevap yazalım ben bilemedim. :lol:

Bu kadar genel kapsamlı veri karşılığında aynı oranda genel kapsamlı cevap alabilirsiniz. Cevabım, uyguladığınız kodda mantık hatası vardır. Kodu görmeden bişey demek zor ama işlemi doğru yaptığını ancak sürenin uzunluğunu ifade ettiğinize göre sorun hakkındaki öngörüm, iç içe döngü kurduğunuzda gereğinden fazla adımla işlem yürüyor, sonuna kadar beklemeye gerek yokken arada BREAK koymayıp sonuna kadar dönmesini bekliyor olmalısınız. İlk hata budur. Diğer hata SCANLINE ile satırı topluca okumak yerine pixel by pixel okuyor olmalısınız. Bu da gecikme yaptırır.
Resim
Resim ....Resim
qamyoncu
Üye
Mesajlar: 266
Kayıt: 12 Tem 2008 04:30

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

Mesaj gönderen qamyoncu »

mümkünse asm kullanın, baya fark yaratacaktır.
Batuhan TAŞDÖVEN
'Yükseldikçe küçülen bir uçurtma..'
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

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

Mesaj gönderen neu84 »

mrmarman yazdı:Neden yavaş ilerlediğini sormuşsunu ama uyguladığınız kodu yazmayı unutmuşsunuz !? Neye dayanarak cevap yazalım ben bilemedim. :lol:

Bu kadar genel kapsamlı veri karşılığında aynı oranda genel kapsamlı cevap alabilirsiniz. Cevabım, uyguladığınız kodda mantık hatası vardır. Kodu görmeden bişey demek zor ama işlemi doğru yaptığını ancak sürenin uzunluğunu ifade ettiğinize göre sorun hakkındaki öngörüm, iç içe döngü kurduğunuzda gereğinden fazla adımla işlem yürüyor, sonuna kadar beklemeye gerek yokken arada BREAK koymayıp sonuna kadar dönmesini bekliyor olmalısınız. İlk hata budur. Diğer hata SCANLINE ile satırı topluca okumak yerine pixel by pixel okuyor olmalısınız. Bu da gecikme yaptırır.

Değerli yorumlarınız ve fikirleriniz için çok teşekkür ederim.. Haklısınız pixel by pixel olarak okuyorum. Ancak okurken degil yeniden yazarken oluyo bu yavaşlık.. Application.ProcessMessages; kullandım her pixelin doluşunu izleyebiliyorum. teker teker oluyo hızlıca olması gerekdigi yerde... Size kodları veriyim, incelerseniz çok sevinirim. Scanline demişsiniz, ben onun nasıl bişey oldugunu bilmiyorum..

Bu blokta image nesnesinin pictureına verdigim 32x32 pixellik bir fotuyu analiz ediyorum. Butona tıkladıgım anda analizini bitiriyor.

Çıktısı bu şekilde oluyo. Sonra ben bu string i alıp bir global degişkene atıyorum. ResimKoduAnaliz prosedürününün içinde bu global degişkenin içerigi koda bakınca anlayacagınız gibi oluyo. harf harf alıp RenkYazdır prosedürüme parametre olarak veriyorum, o da bu harfi hangi o an ki belirtilmiş olan pixele yazıyor. Böyle böyle devam ediyor.
bbbbbbbbbbbrrrrrrrrrrbbbbbbbbbbbbbbbbbbbrrrbbbbbbbbbbrrbbbbbbbbbbbbbbbbrrbbbbbbbbbbbbbbrrbbbbbbbbbbbbrrbbbyyyyyyyyyybbbbrrbbbbbbbbbbrrbbbyy
yyyyyyyyyybbbbbrbbbbbbbbrrbbbbybbbbbbbbyybybbbbbrbbbbbbbrbbbbybbbbbbbbbyybybbbbbbrbbbbbrbbbbbybybbybbybybbbybbbbbrrbbbrrbbbbyyybyybyybyybb
bybbbbbbrbbbrbbbbbybbybbybbyyybbbyybbbbbrrbbrbbbbbybbbbbbbbbybbybbybbbbbbrbrbbbbbybybbybbybbybyyybyybbbbbrbrbbbbbyybyybyybyybbyyybbybbbbbr
brbbbbbybybbybbybybbyyybbybbbbbbrrbbbbbybbbbbbbbbybbyyybbybbbbbbrrbbbbbybybbybbybybbyyybbybbbbbbrrbbbbbyybyybyybyybbyyybbybbbbbbrrbbbbbyby
bbybbybybbyyybbybbbbbbrrbbbbbybbbbbbbbbybbyyybbybbbbbbrrbbbbbybbybbybbyybbyyybbybbbbbrbrbbbbbyyybyybyybybbyyybbybbbbbrbbrbbbbbybybbybbybyb
yyybybbbbbbrbbrbbbbbybbbbbbbbbybbybbybbbbbrbbbbrbbbbybybbybbybybbbbbybbbbbrbbbbrrbbbbybyybyybyyybbbybbbbbrbbbbbbrbbbbyybbybbybbybbbybbbbr
bbbbbbbbrbbbbbybbbbbbbbybybbbbrrbbbbbbbbbrbbbbyyyyyyyyyyybbbbrrbbbbbbbbbbbrrbbbyyyyyyyyybbbbrbbbbbbbbbbbbbbrrrbbbbbbbbbbbbrrbbbbbbbbbbbbbb
bbbrrrrbbbbbbrrrbbbbbbbbbbbbbbbbbbbbbbbrrrrrrbbbbbbbbbbbbb

Kod: Tümünü seç

for Y := 0 to Image1.Width-1 do
 begin
    for X := 0 to Image1.Width-1 do
      begin
         if(ColorToString(Image1.Picture.Bitmap.Canvas.Pixels[X,Y])='clRed') then
            renk:='r'
            else
            if(ColorToString(Image1.Picture.Bitmap.Canvas.Pixels[X,Y])='clYellow') then
            renk:='y'
            else
            if(ColorToString(Image1.Picture.Bitmap.Canvas.Pixels[X,Y])='clBlack') then
            renk:='b'
            else
            if(ColorToString(Image1.Picture.Bitmap.Canvas.Pixels[X,Y])='clLime') then
            renk:='g';
            renkkodlari:=renkkodlari+renk;
      end;
 end;

ResimKoduAnaliz Procedure...

Kod: Tümünü seç

procedure TForm1.ResimKoduAnaliz();
var
sondeger:Ansistring;
I:Int16;
begin
if(yaz='')then
begin
  ShowMessage('bitti');
end
else
begin
for I := 0 to Length(yaz)-1 do
begin
  sondeger:=LeftStr(yaz,index);
  RenkYazdir(string(sondeger));
  yaz:=AnsiString(AnsiRightStr(String(yaz),Length(String(yaz))-index));
  end;
ShowMessage('Analiz Sona Erdi.');
end;
end;

Kod: Tümünü seç

procedure TForm1.RenkYazdir(gelenveri:string);
var
myshape:TShape;
renk:mycolortype;
begin
Application.ProcessMessages;
renk.color:=clBlack;
if(gelenveri='r')then
  begin
     renk.color:=clRed;
  end
    else if(gelenveri='y') then
     begin
      renk.color:=clYellow;
     end
      else if(gelenveri='g') then
        begin
          renk.color:= clLime;
        end
          else if gelenveri='b' then
        begin
          renk.color:= clBlack;
        end;
     if(sayac<=31)then
     begin
         myshape:= TShape.Create(nil);
         myshape.Parent:=self;
         myshape.Enabled:=True;
         myshape.Pen.Color:= renk.color;
         myshape.Pen.Style:=psSolid;
         myshape.Brush.Color:= renk.color;
         myshape.Shape:=stRectangle;
         myshape.Left:=SLeft+SWidth;
         SLeft:=SLeft+SWidth;
         myshape.Height:=5;
         myshape.Top:=STop;
         myshape.Width:=SWidth;
         sayac:=sayac+1;
     end else
         if(sayac>31)then
         begin
         sayac:=0;
         SLeft:=500;
         STop:= STop+5;
         myshape:= TShape.Create(nil);
         myshape.Parent:=Self;
         myshape.Enabled:=True;
         myshape.Pen.Color:= renk.color;
         myshape.Pen.Style:=psSolid;
         myshape.Brush.Color:=renk.color;
         myshape.Shape:=stRectangle;
         myshape.Left:=SLeft+SWidth;
         SLeft:=SLeft+SWidth;
         myshape.Height:=5;
         myshape.Top:=STop;
         myshape.Width:=SWidth;
         sayac:=sayac+1;
      end;
end;

neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

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

Mesaj gönderen neu84 »

qamyoncu yazdı:mümkünse asm kullanın, baya fark yaratacaktır.

Cevap için tşk ederim.. Asm nin ne oldugunu bilmiyorum açıkcası.. Google da arattım assembly sonuçları çıktı. Biraz daha açarmısınız asm yi ve tam olarak ne işe yaradığını.. nasıl kullanıldığını..
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

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

Mesaj gönderen unicorn64 »

bu bbrryy stringini neden oluşturduğunuzu anlamadım...
resimdeki pixelin rengine göre string karşılığını alıyorsunuz, sonra da bu string üzerinden renk değerini alıp shape nesnesinin rengine atama yapıyorsunuz gördüğüm kadarıyla.. bbbrrryy stringinin başka bir kullanım yeri var mı benim göremediğim?

renk değerini doğrudan neden kullanmadınız onu anlamadım
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

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

Mesaj gönderen neu84 »

unicorn64 yazdı:bu bbrryy stringini neden oluşturduğunuzu anlamadım...
resimdeki pixelin rengine göre string karşılığını alıyorsunuz, sonra da bu string üzerinden renk değerini alıp shape nesnesinin rengine atama yapıyorsunuz gördüğüm kadarıyla.. bbbrrryy stringinin başka bir kullanım yeri var mı benim göremediğim?

renk değerini doğrudan neden kullanmadınız onu anlamadım

bbbrrryy stringini oluşturduktan sonra, uzaktaki bir makinada açmış oldugum server uygulamama string tipinde yollayarak ResimKoduAnaliz ve RenkYazdir procedurelerimi çalıştırarak bu string ile yeniden aynı fotografı oluşturuyorum. Ancak ilk verdigim kod blogu ile ilk önce bu bbbrrryy.... oluşturmam lazım. bu arada b black, r red, y yellow, g green i temsil ediyor.. ancak bu bbbrrryyyygg stringini oluştururken çok uzun sürüyor işlem. yani 32x32 lik bir resimde çok fazla hissedilmiyor. 1024 tane karakteri teker teker analiz ediyor.. ancak 100x100, yada 48x288px (13824 karakter)'lik bir foto analiz etmek istedigimde çok bekletebiliyo. o ilk verdigim blogu kendinizde deneyince göreceksiniz ki bekletiyo biraz. hatta Form3.Caption:= IntToStr(X)+' '+IntToStr(Y); kodunu renkkodlari:=renkkodlari+renk; dan sonra yazınca teker teker hangi pixelden geçtigini görebiliyorum. bu garip geliyo bana, çünkü çok hızlı olması gerekirdi diye düşünüyorum... Sizce nasıl çözebilirim bu sorunu..iki sorunum var, hem okurken hemde yeniden fotoyu oluştururken yavaşlık sorunu ancak Şimdilik odaklanmam gereken bu string i oluştururkenki hız sorunu..
cecihan
Üye
Mesajlar: 94
Kayıt: 30 Ara 2006 11:40
İletişim:

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

Mesaj gönderen cecihan »

İşinizi bir miktarda olsa hızlandıracak anahtar kelime Scanline. isterseniz ben c++builder örnekleri gönderirim ama basit bir google aramasıyla onlarca örnek bulursunuz.
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

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

Mesaj gönderen neu84 »

cecihan yazdı:İşinizi bir miktarda olsa hızlandıracak anahtar kelime Scanline. isterseniz ben c++builder örnekleri gönderirim ama basit bir google aramasıyla onlarca örnek bulursunuz.
İnanın siz bana söylediginizden bu saatte kadar araştırıyorum, buluyorum bişeyler ama anlayamıyorum yapılmak istenileni. şu tarzda şeyler buluyorum hep, ancak anlamıyorum.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
  x,y : Integer;
  BitMap : TBitMap;
  P : PByteArray;
begin
  BitMap := TBitMap.create;
  try
    BitMap.LoadFromFile('MyBitmap.png');
    for y := 0 to BitMap.Height -1 do
    begin
      P := BitMap.ScanLine[y];
      for x := 0 to BitMap.Width -1 do
        P[x] := y;
    end;
    Canvas.Draw(0,0,BitMap);
  finally
    BitMap.Free;
  end;
end;
yukarıdaki kodun anladıgım kadarını anlatiyim siz anlarsınız neresini tam olarak anlayamadıgımı..Buarada resmin yolunu gösteriyor. daha sonra 2 döngü ile yükseklik ve genişlige göre işlem yaptırılacak. P:= P := BitMap.ScanLine[y]; satırı var, P yi PByteArray olarak tanıtmışlar, pointer olarak kullanıcaklar. bu satırda ilk başta y nin degeri olan 0.cı satırı P ye aktarıyolar, ne şekilde aktarıldıgını bilemiyorum hiç, daha sonra 2.döngüde resmin genişligi kadar pixel taranıyor, ancakk anlamadıgım şey P[x]:=y; diyerek ne demeye çalışmışlar, bu y nin degerini orayamı atıyo, atmasının ne anlamı var? hadi attı diyelim, ben bu işlemleri yaparken o pixele ait rengin kodunu yada adını çekebilmek istiyorum, ama hiççç bi yerde yokk o şekilde bişey..scanline nın kullanılışının en fazla bu kadarını göstermişler, adım adım göstermemişler, özelliklerinide bilmiyorum. p[x] e bi sayı degilde neden renk verilmiyor, hep böyle örnekler var, aşagıda da verdim bi tane daha o da buna benzer.. bayılmak üzereyim artık :cry: :cry: :cry: :cry:

aşagıdaki kod blogundan kısa bi alıntı göstercem size:
Line[x].B := 0;
Line[x].G := 0;
Line[x].R := x xor y;
Line[x].A := 0;
Şurada da aynısı yapılmış. anlamıyorum neden böyle yaptıklarını, sabitlemişler sanki rengi ama benim çekmek istedigim renkler 4 tane olacak, hangisi oldugunu nerden bilecek bu scanline fonksiyonu.. heryerde hızlı oldugu söylenmiş, biraz bişi yapmışlar ama hep bu şekilde...

Kod: Tümünü seç

var
  x,y  : Integer;
  Line : PRGB32Array;
begin
  with Image1.Picture.Bitmap do
  begin
    PixelFormat := pf32bit;
    Width := Image1.Width;
    Height := Image1.Height;
    for y := 0 to Height - 1 do
    begin
      Line := Scanline[y];
      for x := 0 to Width - 1 do
      begin
        Line[x].B := 0;
        Line[x].G := 0;
        Line[x].R := x xor y;
        Line[x].A := 0;
      end;
    end;
  end;
  Image1.Invalidate;
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

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

Mesaj gönderen unicorn64 »

önceki mesajınızdan şunu çıkardım,
server-client yapı var
client resmi elde ediyor (kameradan alıyor,dosyadan alıyor vs önemli değil)
resmin pixelleri üzerinden döngü kurup resmi string olarak kodluyorsunuz (bbggrryy oluşturuluyor)
oluşan string servera yollanıyor
server gelen stringe göre resmi oluşturuyor..

şimdi RenkYazdir da neden shape oluşturuluyor?
olay server-client arası resim transferi ise neden böyle karmaşık bir yapı kurguladınız ki,doğrudan dosya transferi yada byte dizisiyle aktarım daha kolay olmaz mıydı?
bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
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 »

Scanline yapısını öğrenmen için kendi projenle ilişkili olarak karşılaştırmalı bir örnek hazırladım.

Bu kadar küçük image nesnelerinde scanline veya pixels kullanımında hızla ilgili öyle aman aman sorunun yaşamazın. Ben ilk cevapta dah büyük ve renk derinliği yüksek image içeriğinde işlem yaptığını (yani bir ekran kopyasını başka bilgisayara aktarsaydın gibisinden) scanline kullanmanı önermiştim.

Sen bildiğin yöntemi uygula. Buradaki hatan direkt görsel bir ortama taşımaya çalışmandan dolayı her adımda görsel işlemin sonucunu bekliyor olmandan kaynaklı. Yani resmi bileşenlerine ayırmaya kadar sorun yok diyebilirim. Sorun satır satır aktarıp shape dönüşümünde. Bunu shape ile değil de yine canvas üzerine rectangle ile kareler çizerek yaparsan hızla ilgili sorunun kalmayacaktır.

Bumesaj ekinde örnek proje göreceksin.
ResimTransfer.rar
Scanline Pixels Karşılaştırmalı örnek
(175.18 KiB) 233 kere indirildi
Örnekte, kendi mesajında belirttiğin string ifadeyi resme dönüştürüp, bu dönüştürülen resmi bir Pixels ile bir de ScanLine ile karşılaştırmalı olarak işleme alış hızlarını aynı resim için inceleme fırsatı sunmak amaçlı.

Resme Dönüşüm Kodu :

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
Const
  Kodlar = ( ['r', 'b', 'y', 'g'] );
Var
  i, j     : Integer;
  Veri     : String;
  RenkKodu : Char;
begin
  Image1.Picture.Bitmap.Width  := 32;
  Image1.Picture.Bitmap.Height := 32;
  Image1.Picture.Bitmap.PixelFormat := pf8Bit;
  Image1.Picture.Bitmap.Canvas.Brush.Color := clWhite;
  Image1.Picture.Bitmap.Canvas.FillRect( Image1.Picture.Bitmap.Canvas.ClipRect );
  i := -1;
  j := 0;
  Veri := Trim(Memo1.Text);
  while Length(Veri) > 0 do
  begin
    while (Length(Veri) > 0) AND (NOT (Veri[1] in Kodlar) )
      do System.Delete(Veri, 1, 1); // Yabancı kod veya karakter varsa eledik.
    RenkKodu := Veri[1];
    System.Delete(Veri, 1, 1);
    inc(i);
    if i > 31 then begin
      i := 0;
      inc(j);
    end;
    case RenkKodu of
     'r': Image1.Picture.Bitmap.Canvas.Pixels[i,j] := clRed;
     'y': Image1.Picture.Bitmap.Canvas.Pixels[i,j] := clYellow;
     'b': Image1.Picture.Bitmap.Canvas.Pixels[i,j] := clBlack;
     'g': Image1.Picture.Bitmap.Canvas.Pixels[i,j] := clLime;
    end;
  end;
end;
Canvas.Pixels metodu ile deşifre edilişi

Kod: Tümünü seç

procedure TForm1.BitBtn2Click(Sender: TObject);
Var
  i, j     : Integer;
  RenkKodu : Char;
  Satir    : String;
begin
  i := 0;
  j := 0;
  Memo2.Lines.Clear;
  Application.ProcessMessages;
  while i < 32 do begin
    Satir := '';
    while j < 32 do begin
      RenkKodu := '.';
      case Image1.Picture.Bitmap.Canvas.Pixels[j,i] of
      clRed    : RenkKodu := 'R';
      clYellow : RenkKodu := 'Y';
      clBlack  : RenkKodu := 'B';
      //clLime   : RenkKodu := 'G';
      end;
      Satir := Satir + RenkKodu;
      inc(j);
    end;
    Memo2.Lines.Add(Satir);
    j := 0;
    inc(i);
  end;
end;
Scanline ile deşifre edilişi.

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';
      //clLime   : RenkKodu := 'G';
      end;
      Satir := Satir + RenkKodu;
      inc(j);
    end;
    Memo2.Lines.Add(Satir);
    j := 0;
    inc(i);
  end;
end;
umarım faydalı olur. Başarılar.
Resim
En son mrmarman tarafından 01 Nis 2011 08:21 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Resim
Resim ....Resim
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

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

Mesaj gönderen neu84 »

unicorn64 yazdı:önceki mesajınızdan şunu çıkardım,
server-client yapı var
client resmi elde ediyor (kameradan alıyor,dosyadan alıyor vs önemli değil)
resmin pixelleri üzerinden döngü kurup resmi string olarak kodluyorsunuz (bbggrryy oluşturuluyor)
oluşan string servera yollanıyor
server gelen stringe göre resmi oluşturuyor..

şimdi RenkYazdir da neden shape oluşturuluyor?
olay server-client arası resim transferi ise neden böyle karmaşık bir yapı kurguladınız ki,doğrudan dosya transferi yada byte dizisiyle aktarım daha kolay olmaz mıydı?
Evet aynen anlattıgınız gibi bir işleyişi var.. Shape ile oluşturmamın nedeni deneme amaçlı, acaba sorunsuz analiz edip kodları oluşturuyormuyum ve bu kodlar eksiksiz ve düzgün bir şekilde yerine ulaşıyor mu onu ögrenme amaçlı.. transferi string olarak yapmak zorundayım, benden istenen bu şekilde çünkü, byte dizisiyle yapmayı denedim ama yapamadım. Gerçi her halukarda string olarak yollamam lazım.. Stringi oluşturma işlemi uzun sürüyor, kısaltmam lazım..
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

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

Mesaj gönderen neu84 »

mrmarman
Çok Teşekkürrr ederimmmmm, scanline ile böyle bi örnege ulaşamamıştım dün gün boyu araştırma yaparken, çok teşekkür ederim. Kodunuzu inceliycem hemen deneme yapıcam, takıldıgım noktalarda size yine sorular yöneltebilirimm.. Çok teşekkür ederimm ilginiz için. Ellerinize saglık..

Buradaki hatan direkt görsel bir ortama taşımaya çalışmandan dolayı her adımda görsel işlemin sonucunu bekliyor olmandan kaynaklı. Yani resmi bileşenlerine ayırmaya kadar sorun yok diyebilirim.
Şuan da en büyük sorun resmin pixellerini ayırıştırırken yavaş olması. resmi shape ile yeniden oluşturma safhası şimdilik test gibi, yani oluşturdugum kodun saglaması gibi bişey diyim. Çünkü benim ilk başta sorunsuz olarak performanslı bi şekilde bu stringi oluşturmam lazım. İşte bu stringi oluştururken yavaş oluyo bu olay. Sizin verdiginiz örnekleri deniycem şimdi.

Kod: Tümünü seç

 
 1     Okunan := pByteArray( Image1.Picture.Bitmap.Scanline[i] );
 2     Satir := '';
 3     while j < 32 do begin
 4    case Okunan[j] of
 5     $F9 : RenkKodu := 'R';
 6     $FB : RenkKodu := 'Y';
  7    $00 : RenkKodu := 'B';
  8    //clLime   : RenkKodu := 'G';
Şimdi bakınca sorma gereksinimi duydugum bişeyler var,
burada $F9 $FB renk kodlarımı oluyor? Yukarıdaki kodunuzda satır sayısı olarak numaralandırdım daha rahat anlatabiliyim diye sorumu. 1. satırda scanline ile satır'ı mı alıyorsunuz? ve 4.satırda Okunan[j] diyerek o satıra ait sutunları mı anlıyorsunuz? scanlinede anlamakta güçlük çektigim nokta burası.. Birde 8.satırda clLime e, 5,6,7. satırlarda diger renklere vermiş oldugunuz gibi nasıl kod verebilirim, bi listesi mi var, adı ne oluyor bunların?
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 »

Sorularını cevplayım o zaman.
@neu84 yazdı:Şimdi bakınca sorma gereksinimi duydugum bişeyler var,
burada $F9 $FB renk kodlarımı oluyor? Yukarıdaki kodunuzda satır sayısı olarak numaralandırdım daha rahat anlatabiliyim diye sorumu. 1. satırda scanline ile satır'ı mı alıyorsunuz? ve 4.satırda Okunan[j] diyerek o satıra ait sutunları mı anlıyorsunuz? scanlinede anlamakta güçlük çektigim nokta burası.. Birde 8.satırda clLime e, 5,6,7. satırlarda diger renklere vermiş oldugunuz gibi nasıl kod verebilirim, bi listesi mi var, adı ne oluyor bunların?
Cevaplarken sorularının yerini değiştirirsem daha uygun olacak.
* 1. satırdaki Scanline ile istediğimiz herhangi bir satırı topluca alarak bir diziye atıyoruz. Bu işlem 1024 pixel genişliğinde de olsa, 32 pixel de olsa çok kısa zamanda gerçekleşen bir operasyon.

* 4.satırda Okunan[j] dediğimizde diziye aldığımız noktaları "j" numaralı sıradaki yani sütundaki nokta özelliğini okuyoruz.

* Diziye aldığımız değerleri 16'lık sayı düzeninde değerlendiriyorum. Siz bunları 10'luk tabanlı rakamlarla da ifade edebilirsiniz. Benim için kodlaması ve anlamlandırması kolay olması açısından 16'lık düzeni tercih ediyorum. $F9 $FB gibi değerleri nasıl elde ediyoruz, Format( '%.2x', [ Okunan[j] ]); içeriğini bir memo beya message dialog ile ekrana yansıtırsanız, okunan rengin karşılığını 16'Lık düzende okumuş olurunuz. Siz de uygun olan rengi ilgilenmek üzere portföyünüze alırsınız.

* cmLime için ise sizin örnekte buna ilişkin renk içeriği olmadığından remark altında vermiştim. Madem merak ettiniz, aynı şekilde sorgularsanız $FA sayısını elde edersiniz.

Kod: Tümünü seç

$FA : RenkKodu := 'G';
şeklinde sorgulara ekleyebilirsiniz.

başarılar.
Resim
Resim ....Resim
neu84
Üye
Mesajlar: 307
Kayıt: 06 Oca 2011 11:27

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

Mesaj gönderen neu84 »

Çok teşekkür ederim açıklamanız için.

Kodlara bakıyorum, çalıştıyorum ancak bi sorun var, scanline ile okumak istedigimde sizin uygulamanızda, şu şekilde aşagıdaki gibi noktlar çıkıyor. söylediginiz gibi clLime ın kodunu $FA : RenkKodu := 'G'; şeklinde ekledim ancak nedense böyle bi çıktı alıyorum. yanyana ikitane ok çıkıyor, ama öyle dgil, bitane ok çıkması lazım.. hemen altta pixels ile yapmış oldugunuz örnegin çıktısı var, o çok düzgün çıkıyor, ancak scanline olan böyle sorunlu. bi çok şey denedim ama ama bütün resimlerde böyle çift çıkarıyor.
Diziye aldığımız değerleri 16'lık sayı düzeninde değerlendiriyorum. Siz bunları 10'luk tabanlı rakamlarla da ifade edebilirsiniz.
Ancak sizin yazdıgınız tarzın dışında başka kabul etmiyor, $E101F0 : RenkKodu := 'B' yazdım ama kabul etmedi.


BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBB.BBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBB..BBBBBBBBBBBBBB.BBBBBBBB
BBBBBB...BBBBBBBBBBBBBB..BBBBBBB
BBBBBB....BBBBBBBBBBBB...BBBBBBB
BBBBB.....BBBBBBBBBBBB....BBBBBB
BBBBB......BBBBBBBBBB.....BBBBBB
BBBB.......BBBBBBBBBB......BBBBB
BBBBBB...BBBBBBBBBBB.......BBBBB
BBBBBB...BBBBBBBBBBBBB...BBBBBBB
BBBBBB...BBBBBBBBBBBBB...BBBBBBB
BBBBBB...BBBBBBBBBBBBB...BBBBBBB
BBBBBB...BBBBBBBBBBBBB...BBBBBBB
BBBBBB...BBBBBBBBBBBBB...BBBBBBB
BBBBBB...BBBBBBBBBBBBB...BBBBBBB
BBBBBB...BBBBBBBBBBBBB...BBBBBBB
BBBBBB...BBBBBBBBBBBBB...BBBBBBB
BBBBBB...BBBBBBBBBBBBB...BBBBBBB
BBBBBB...BBBBBBBBBBBBB...BBBBBBB
BBBBBB...BBBBBBBBBBBBB...BBBBBBB
BBBBBB...BBBBBBBBBBBBB...BBBBBBB
BBBBBBBBBBBBBBBBBBBBBB...BBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB


Pixels ile yapılmış ögreniginiz.



bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbgbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbgggbbbbbbbbbbbbbbb
bbbbbbbbbbbbbgggggbbbbbbbbbbbbbb
bbbbbbbbbbbbgggggggbbbbbbbbbbbbb
bbbbbbbbbbbgggggggggbbbbbbbbbbbb
bbbbbbbbbbgggggggggggbbbbbbbbbbb
bbbbbbbbbgggggggggggggbbbbbbbbbb
bbbbbbbbbbbbbgggggbbbbbbbbbbbbbb
bbbbbbbbbbbbbgggggbbbbbbbbbbbbbb
bbbbbbbbbbbbbgggggbbbbbbbbbbbbbb
bbbbbbbbbbbbbgggggbbbbbbbbbbbbbb
bbbbbbbbbbbbbgggggbbbbbbbbbbbbbb
bbbbbbbbbbbbbgggggbbbbbbbbbbbbbb
bbbbbbbbbbbbbgggggbbbbbbbbbbbbbb
bbbbbbbbbbbbbgggggbbbbbbbbbbbbbb
bbbbbbbbbbbbbgggggbbbbbbbbbbbbbb
bbbbbbbbbbbbbgggggbbbbbbbbbbbbbb
bbbbbbbbbbbbbgggggbbbbbbbbbbbbbb
bbbbbbbbbbbbbgggggbbbbbbbbbbbbbb
bbbbbbbbbbbbbgggggbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
Cevapla