| Autor |
Beitrag |
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mo 10.01.05 17:39
Was ich versuche ist folgendes:
Per Textout wird ein Buchstabe aufs Canvas geschrieben (Form1.Canvas). Nun soll aber der Buchstabe so eine art diffuses Leuchten haben, und ich dachte, ich schnapp mir den schönen Blureffekt von obbschtkuche:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| type pRGBArray2 = ^TRGBArray2; TRGBArray2 = array[0..32768-1, 0..2] of byte;
TForm1 = class(TForm)
procedure TForm1.SpBlur(var Picture: TBitmap); var Dest, row1, row2, row3: pRGBArray2; x, y,i : integer; BMP: TBitmap; begin BMP := TBitmap.create; try BMP.Assign(Picture); for y := 1 to Picture.Height - 2 do begin Dest := Picture.ScanLine[y]; row1 := BMP.ScanLine[y-1]; row2 := BMP.ScanLine[y]; row3 := BMP.ScanLine[y+1]; for x := 1 to BMP.Width - 2 do if PDWord(@Dest^[x,0])^ > 0 then for i := 0 to 2 do Dest^[x,i] := (row1^[x-1, i] * 3 + row1^[x, i] * 3 + row1^[x+1, i] * 3 + row2^[x-1, i] * 3 + row2^[x, i] * 8 + row2^[x+1, i] * 3 + row3^[x-1, i] * 3 + row3^[x, i] * 3 + row3^[x+1, i] * 3) div 32 end; finally BMP.Free; end end; |
(mein Hintergrund ist schwarz)
und wende ihn indirekt auf ein Canvas an:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var b:TBitmap; begin b:=TBitmap.Create; b.Assign(Form1.Canvas); SpBlur(b); Form1.canvas.draw(-1,-1,b); b.Free; |
Dass das nicht klappt habe ich bemerkt -.- Nun kapier ich aber leider sowenig von dem Source(warum steht da ein ^ drin???  und sowas...  ), dass sich folgende Fragen stellen:
Ist der Algorithmus denn überhaupt schnell genug für mich? ich dachte daran, ihn alle 10 ms zu wiederholen...  kann ich das auch besser lösen? indem ich nur den entsprechenden buchstaben verschwimmen lasse, z.B.?
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
GSE
      
Beiträge: 740
Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
|
Verfasst: Mo 10.01.05 18:30
schau dir mal BitBlt in der Hilfe an (du kannst einem TBitMap kein TCanvas zuweisen)
| Zitat: | | warum steht da ein ^ drin?? |
das liegt daran dass er mit pointern arbeitet (-> Pointertutorial)
| Zitat: | | Ist der Algorithmus denn überhaupt schnell genug für mich? |
eher nicht es sei denn du hast nen 20gig rechner daheim rumstehen (naja übertrieben  )
| Zitat: | | kann ich das auch besser lösen? |
kannst du (Hardwarebeschleunigung) oder prerendern
| Zitat: | | indem ich nur den entsprechenden buchstaben verschwimmen lasse |
ist auch ein Ansatz, denke aber imme rnoch zu langsam
mfg
GSE
_________________ Programming today is a race between software engineers striving to build bigger and better idiot-proof programs
and the universe trying to produce bigger and better idiots. So far, the universe is winning. (Richard Cook)
|
|
JayEff 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mo 10.01.05 18:42
es geht darum, immer genau 2 zeichen zur glecihen zeit ganz leicht verchwimmen zu lassen... und die beiden sind ganz klein... aber gut, ich habe mir deine Vorschläge angeguckt. aber ich hab dermaßen keine ahnung von Prerendern und Hardware beschleudigung. ich muss mir da wohl mal tutorials dazu raussuchen. obbschtkuche benutzt diesen Algorithmus übrigens in seinem Funken projekt was genial flüssig läuft, jedenfalls auf meinem rechner. ich werd das teil mal genauestens unter die lupe nehmen...
Hiermit bringts mir KEINE Fehler, aber ich seh GARNIX. (liegt NICHT an der Blur Funktion, da ich diese mal rauskommentiert hatte, vorrübergehend.)
Delphi-Quelltext 1: 2: 3:
| b.Canvas.TextOut(x1,y1,'X'); SpBlur(b); Form1.Canvas.Draw(-1,-1,b); |
die koordinaten sind auch nicht ausserhalb des bildes oder so....
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: So 16.01.05 12:35
Hast du schon deinen fehler gefunden?
hab mir nur das hier angeschaut:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| var b:TBitmap; begin b:=TBitmap.Create; b.Assign(Form1.Canvas); SpBlur(b); Form1.canvas.draw(-1,-1,b); b.Free; |
wie gse schon gesagt hat: BitBlt oder copyrect.
noch ein paar Bemerkungen von mir
-Du wirst in deiner Bitmap auch nie was sehen, wenn du ihr keine Größe per width und height zuweißt.
-Außerdem solltest du auch das pixelformat bei beiden bitmaps entsprechend einstellen.
-Was dich unheimlich viel zeit kosten wird, sind die create-aufrufe der Bitmaps und der notwendigen Größenänderung. Auch wenn es verpönt ist mit globalen Variablen zu arbeiten, hier mußt du es. Der zeitunterschied, wenn du die Bitmaps nicht jedesmal neu erzeugst, ist je nach Größe der bitmap gewaltig.
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
JayEff 
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Mo 17.01.05 15:00
es wird wohl die zuweisung von width und height gewesen sein, danach giengs, aber bei einer gaanz kleinen bitmap dauerte es ewig -.- ich vermute mal, dass es unmöglich ist, einen schnellen blureffekt für eine bitmap zu schreiben... jedenfalls keinen, der mal eben auf ein 1024*768 bitmap angewandt werden kann... ^^ damit ist die Frage wohl erledigt... falls noch jemand vorschläge hat - imma her damit 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Mo 17.01.05 20:18
was verstehst du unter ewig? Hast du das mit dem bitmap.create geändert? Ansonsten zeig mal deinen code, wie er jetzt ist.
Wenn du Interesse hast, gugg bei www.efg2.com vorbei, dort findest du mit sicherheit auch was über blur und entsprechende demos.
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
|