Memo nesnesini içindeki yazılarla bitmap olarak kaydetme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
kelaynak2
Üye
Mesajlar: 135
Kayıt: 30 Haz 2003 02:18

Memo nesnesini içindeki yazılarla bitmap olarak kaydetme

Mesaj gönderen kelaynak2 »

Bir Tmemo nesnesini içindeki yazılarla birlikte bitmap olarak nasıl kaydedebirim. Aşağıdaki şekilde bir kod yazdım ama Memonun Canvas özelliğine ulaşamadım.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
Bitmap: TBitmap;
begin
if savedialog1.Execute then begin
Bitmap := TBitmap.Create;
Bitmap.PixelFormat := pf1bit;
bitmap.Height:=memo1.ClientHeight;
bitmap.Width:=memo1.ClientWidth;
bitmap.Canvas.Draw(0,0,memo1.CanvasYok);
bitmap.SaveToFile(savedialog1.FileName);
bitmap.Free;
end;
Misafir

Mesaj gönderen Misafir »

merhaba.
yapmak istediğiniz tam olarak anlaşılmıyo (ya da ben anlayamadım kim bilir).capture yöntemi işinizi görür mü bilmiyorum ama anladığım kadarıyla görür :)
kolay gelsin.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

aklıma ilk gelen yöntem, memodaki satırları teker teker textout komutuyla bitmapin canvasına yazdırmak.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
kelaynak2
Üye
Mesajlar: 135
Kayıt: 30 Haz 2003 02:18

Capture yöntemi

Mesaj gönderen kelaynak2 »

Ekranın capturesini almayı biliyorum. Aynı şekilde klavyeden print screen tuşu ile de kapture yapıp daha sonra bir resim işleme programına paste etmek mümkün.Ama daha sonra Memo alanını keseceksin, ayrı bir resim olarak kaydedeceksin vs. Uzun iş.
Benim yapmak istediğim yazmakta olduğum bir ocr programını test etmek amacıyla (scannerim olmadığından) memoya yazılan yazıları resim olarak kaydedip, Ocr ile okunmasını sağlamak. Yani sadece Test etmek amacıyla yazılarla birlikte resim olarak kaydetmek istiyorum.

aşağıdaki kod memoyu kaydediyor, ama yazıları kaydetmiyor.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
Bitmap: TBitmap;
hv:hdc;
begin
if savedialog1.Execute then begin
Bitmap := TBitmap.Create;
Bitmap.PixelFormat := pf1bit;
bitmap.Height:=memo1.Height;
bitmap.Width:=memo1.Width;
hv:=bitmap.canvas.Handle;
memo1.PaintTo(hv,0,0);
bitmap.SaveToFile(savedialog1.FileName);
bitmap.Free;

end;


end;

Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

eğer memonun içindeki yazıları kaydetmek istiyoranız

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject); 
var 
Bitmap: TBitmap; 
hv:hdc; 
begin 
if savedialog1.Execute then begin 
Bitmap := TBitmap.Create; 
Bitmap.PixelFormat := pf1bit; 
bitmap.Height:=memo1.Height; 
bitmap.Width:=memo1.Width; 

For i:=0 to memo1.lines.count-1 do
   bitmap.Canvas.TextOut(1,i * 10, memo1.lines[i]);

bitmap.SaveToFile(savedialog1.FileName); 
bitmap.Free; 
end; 
end; 
gibi bir kod işinizi görebilir...



http://www.dsdt.info/tipps/?id=325

Kod: Tümünü seç

procedure TextToBitmap(const AText: TStrings; ATarget: TBitmap; AMarginX: Integer=0; AMarginY: Integer=0);
  var Y: Integer; 
        LineH, LineW: Integer;
begin 
  ATarget.Width:=0; 
  LineH:=ATarget.Canvas.TextHeight('Wg'); 
  ATarget.Height:=(AText.Count*LineH)+(AMarginY*2); 
  for Y := 0 to AText.Count-1 do 
  Begin   
    LineW:=ATarget.Canvas.TextWidth(AText.Strings[Y] 1;+ AMarginX*2;   
  if ATarget.Width<LineW then     
    ATarget.Width:=LineW;   
 
ATarget.Canvas.TextOut(AMarginX, AMarginY+LineH*Y, AText.Strings[Y]); 
  end;
end;

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var Strings: TStringList;
begin 
Strings := TStringList.Create; 
try   
  Strings.LoadFromFile('C:\WINDOWS\wmsetup.log') ;   
  TextToBitmap(Strings, Image1.Picture.Bitmap, 1, 0); 
finally   
  Strings.Free; 
end;
end;
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
kelaynak2
Üye
Mesajlar: 135
Kayıt: 30 Haz 2003 02:18

Teşekkürler.

Mesaj gönderen kelaynak2 »

Sadettin bey,
verdiğiniz ikinci kod işe yaradı. memo1'in birebir suretini yapmayı başardım. Kodu aşağıdaki şekilde değiştirdim.

Kod: Tümünü seç

procedure Tform1.TextToBitmap(const AText: TStrings; ATarget: TBitmap; AMarginX: Integer=0; AMarginY: Integer=0);
  var Y: Integer;
        LineH, LineW: Integer;
begin
  ATarget.Width:=memo1.Width;//0;
  LineH:=ATarget.Canvas.TextHeight('Wg');
  ATarget.Height:=memo1.height;//(AText.Count*LineH)+(AMarginY*2);
  for Y := 0 to AText.Count-1 do
  Begin
    LineW:=ATarget.Canvas.TextWidth(AText.Strings[Y])+ AMarginX*2;
  if ATarget.Width<LineW then
    ATarget.Width:=LineW;

ATarget.Canvas.TextOut(AMarginX, AMarginY+LineH*Y, AText.Strings[Y]);
  end;
end;

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
begin
image1.Picture.Bitmap.Canvas.Font:=memo1.Font;
TextToBitmap(memo1.Lines, Image1.Picture.Bitmap, 0, 0);
end;
Yardımınız için teşekkür ederim. :D
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

rica ederim.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
kelaynak2
Üye
Mesajlar: 135
Kayıt: 30 Haz 2003 02:18

Bir sorum daha olacaktı

Mesaj gönderen kelaynak2 »

Sadettin bey bir sorum daha olacaktı.Umarım bir çözüm biliyorsunuzdur.Bu işide halledersem benim OCR programı tamam.Karekterleri tanımayı neuralnet ile hallettim.
pf1bit bir bitmapda beyaz zemin üzerinde bitmapın başından itibaren renkleri pixel, pixel okuyup siyah bir renge gelince(bir harfe) bu siyah rengin etrafındaki pixselleri tek tek test ederek siyahsa ayrı bir bitmapa siyah pixsel, siyah değilse örneğin sağa ilerlemeyi bırakıp, üste ilerleyip aynı şekilde renklerin siyah mı beyazmı olduğunu kontrol edip, üst bitince tekrar alta yönelerek renklerin kontrolünü sağlamak ve böylece bu siyah rengi tamamen başka bir bitmapa aktarmak istiyorum.
Örneğin incelemeyi yapan noktamız >>>>>A harfine çarptığı anda A harfini oluşturan pixelleri kendisine komşu olan pixellerin siyahmı beyazmı olduğunu kontrol ederek tüm A harfini taradıktan sonra farklı bir bitmapa yazsın,

http://www.neobee.net/~ilicv/OCR.ZIP adresindeki programı çekerseniz ne demek istediğimi anlarsınız, Programda Optionsda view color line çentikli olmalı ve bmpyi yükledikten sonra test tuşuna tek tek basarsanız bitmap üzerindeki siyah harflerin nasıl kırmızıya boyandığını görebilirsiniz.(test2.bmp veya test3.bmp yi kullanın.test1.bmp hata veriyor) Benimde yapmak istediğim bu.Gerçi Türkçede Ö,Ü,İ gibi harflerde ana pixellerden ayrı noktalar var, fakat onları başka şekilde hallederim. Yardımınız için şimdiden teşekkürler.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

NeuroVCL örneklerini incelediniz mi?
http://ilicv.on.neobee.net/neuro_examples.zip

birde efg laba bakmanızı önerebilirim.
http://www.efg2.com/Lab/Library/Delphi/ ... s/Math.htm
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
kelaynak2
Üye
Mesajlar: 135
Kayıt: 30 Haz 2003 02:18

Şimdiye Kadar Yaptıklarım

Mesaj gönderen kelaynak2 »

Sadettin bey,
Ocr konusunda şimdiye kadar yaptıklarımı http://www.bakale.com/delphi/ocrhazirlik.zip adresinden kaynak kodları dahil çekebilirsiniz.Bu dosyalar arasında NeuroOCR.exe başka bir firmanın yaptığı örnek programda var .Bu programın aynısını bende yaptım.Yani klavyeden girilen karekteri yaptığım program tanıyabiliyor.

Yukarıda bildirdiğiniz exampleslerin hepsini de kaynak kodları açık farklı neuralnetwork componentleri kullanarak yapmıştım.
Kaynak kodlarını incelerseniz sevinirim. Benim tahminim inceleme noktası resim üzerindeki bir karektere temas edince bu karekterin belirli bir noktaya göre maximum boyunu ve enini bir fonksiyonla öğreniyor ve karekteri bir regdangle ile resimden kopyalıyor.
Kullanıcı avatarı
kelaynak2
Üye
Mesajlar: 135
Kayıt: 30 Haz 2003 02:18

Helal olsun

Mesaj gönderen kelaynak2 »

Yukarıda OCRyi yazan Yugoslava kodları göndermesini istedim.OCRnin mantığın nasıl olduğuna dair bir şema gönderdi. Birilerinin işine yarar diye verdiği cevabı ve resmi buraya ekliyorum.Biraz daha ingilizcem olsa yazdığım her şeye cevap verecek.
Bunada şükür, hiç bir şey göndermeyebilirdi. :o
hi Kelaynak2,

> Please Velibor help me. I Succeed recognize all charecter smallfont size 7
> with Neuralnet. But how I seperate a charecter on a bitmap.Excatly like your
> OCR prg. I read per pixel, if pixel Black then I can tested its neighbor
> pixel which black or white. If it is black, I test next pixel etc.And I can
> Writing this pixel a otherther bitmap and I translate this pixels "0" and
> "1".


my method for extraction letters are very simple but not most
efficiently method....

I will try to explain it...

when I found black pixels I am detecting pixels around it (up, down,
left and right try to imagine square around pixel) if I found pixel in
one of the side of this square in next iteration I make this square
larger and larger until I get only white pixels in all four sides of
this rectangle, like in following example...


000000
001100
010010
011110
010010
010010
000000


> Are you use scanline?

Scanline is faster method but I didn't used scanline method, I was
access pixels with function Canvas.Pixel[x,y]...

best regards, Velibor
--
e-mail: mailto:ilicv@EUnet.yu

homepage: http://SOLAIR.EUnet.yu/~ilicv
: http://come.to/velibor


Resim
Cevapla