Autor Beitrag
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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:
ausblenden volle Höhe Delphi-Quelltext
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
    // Nur wenn Pixel nicht schwarz ist
    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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var b:TBitmap;
begin
b:=TBitmap.Create;
b.Assign(Form1.Canvas); //<-- da klappts nich.
 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??? :shock: 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... :D kann ich das auch besser lösen? indem ich nur den entsprechenden buchstaben verschwimmen lasse, z.B.?

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
GSE
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 740

Win 2k, Win XP Pro
D5 Prof, D6 Ent, D2k5 PE
BeitragVerfasst: 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 :wink:)
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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.)
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: So 16.01.05 12:35 
Hast du schon deinen fehler gefunden?
hab mir nur das hier angeschaut:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var b:TBitmap;  
begin  
b:=TBitmap.Create;  
b.Assign(Form1.Canvas); //<-- da klappts nich.  
 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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 :D

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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)