Autor |
Beitrag |
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mo 26.03.07 17:44
Ein überarbeiteter Library-Eintrag ist hier zu finden.
Alphablend zweier Bilder
Folgernder Code dient dazu zwei TGraphic typen (also Bitmap, jpeg, usw) mittels Alphablend zu einem Bitmap zu verschmeltzen.
Die Beiden Images (Image1 und Image2) sind typen die von TGraphic abgeleitet sind und müssen existieren.
Ebenso wie das ResultBitmap das übergeben werden muss. In dieses wird dann das Alphablendbild "geschrieben".
Mit den AlphaValue wird dann der Wert beschrieben welches Bild stärker werden soll. Mit 0 wird nur das erste Bild gezeigt und mit 255 nur das zweite.
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: 34: 35: 36:
| procedure AlphaImgs(Image1, Image2: TGraphic; ResultBitmap: TBitmap; AlphaValue: Byte); type pixel = Array [0..2] of byte; var bmpImg1, bmpImg2: TBitmap; x,y,h,w: integer; p1, p2: ^pixel; begin bmpImg1:=TBitmap.Create; bmpImg2:=TBitmap.Create; try bmpImg1.Height:=Image1.Height; bmpImg2.Height:=Image2.Height; bmpImg1.Width:=Image1.Width; bmpImg2.Width:=Image2.Width; bmpImg1.PixelFormat:=pf24bit; bmpImg2.PixelFormat:=pf24bit; bmpImg1.Canvas.Draw(0,0,Image1); bmpImg2.Canvas.Draw(0,0,Image2); h := Min(bmpImg1.Height, bmpImg2.height); w := Min(bmpImg1.Width, bmpImg2.Width); for y :=0 to h-1 do begin p1 := bmpImg1.ScanLine[y]; p2 := bmpImg2.ScanLine[y]; for x:= 0 to w-1 do begin p1^[0] := ((p1^[0]*(AlphaValue+1) + (p2^[0]*(256-AlphaValue))) shr 8); p1^[1] := ((p1^[1]*(AlphaValue+1) + (p2^[1]*(256-AlphaValue))) shr 8); p1^[2] := ((p1^[2]*(AlphaValue+1) + (p2^[2]*(256-AlphaValue))) shr 8); inc(p1); inc(p2); end; end; ResultBitmap.Assign(bmpImg1); finally bmpImg1.Free; bmpImg2.Free; end; end; |
Aufrufen könnte man nun diese prozedur wiefolgt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TfrmMain.btnblendClick(Sender: TObject); var bmpresult:TBitmap; begin ImageResult.Picture.Assign(nil); bmpresult:=TBitmap.Create; AlphaImgs(Image1.Picture.Graphic,Image2.Picture.Graphic,bmpresult,Byte(sbAlpha.Position)); ImageResult.Picture.Assign(bmpresult); bmpresult.Free; end; |
freu mich auf Kritik.
ToDo: Das erste Bild fix als Hintergrund verwenden und das zweite Darüberblenden, ohne das erste abzuschneiden.
ToDo: Das ganze dann noch variabel machen sodass man dem programm sagen kann bei welchen koordinaten das zweite bild darübergeblendet werden soll
lg elundril
//edit: hab den Code zum Alphablenden der einzelnen Bitmapfarben gekürzt.
//edit: Try-Finally Block eingefügt
//edit: Fehler mit Klammern beseitigt
Angehängt ist ein beispielprogramm. Es wäre nett wenn mein Name erwähnt wird bei Programmen die diese prozedur verwenden.
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von elundril am Di 03.03.09 19:57, insgesamt 7-mal bearbeitet
|
|
Blawen
Beiträge: 616
Erhaltene Danke: 33
Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
|
Verfasst: Do 29.03.07 21:20
Zitat: | Angehängt ist ein beispielprogramm. Es wäre nett wenn mein Name erwähnt wird bei Programmen die diese prozedur verwenden. |
Hast Du ev. vergessen den Anhang hochzuladen?
_________________ Es kompilert, wir können ausliefern.
Und es kompiliert wieder - das Update ist fertig - bitte 100 Euro
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Do 29.03.07 23:44
ups stimmt! sry!
lg el
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Di 22.05.07 10:44
keine Rückmeldungen?
lg el
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 28.05.07 17:32
Hi!
Sorry, Lib-Beiträge zu prüfen ist deutlich aufwendiger als Forenbeiträge zu überfliegen. Da habe ich nicht immer Zeit für.
Jetzt aber:
Zuerst fällt mir auf, dass da try-finally fehlt. Du gibst zwar brav alles wieder frei, aber ein try-finally wäre da der Zuckerguss
Außerdem: Was passiert, wenn Image1 größer als Image2 ist? Wenn ich richtig sehe, greift man dann auf Speicher zu, von dem man die Finger lassen sollte.
Grüße
Christian
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mi 30.05.07 19:38
kann man mir mal helfen?
ich hab keine idee wie ich das überprüfen könnte. ich hab mir gedacht das ich vielleicht nachschauen kann ob im pointer was drin ist oder leer.
ne andere idee is halt das ich überprüf welches größer ist aber das würde den Quellcode ungemein vergrößern.
lg el
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 15.07.07 11:45
Also, zum einen schreibt man die "TIrgendwas.Create" immer vor das try und nicht mit rein.
Nun zu der Sache mit der Größe:
Du hast zwei Möglichkeiten
(1) Du kannst eine Exception werfen, wenn das erste Bild größer als das Zweite ist
(2) Du lässt die Schleifen jeweils bis zum Minimum der beiden Seitenlängen laufen
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: So 15.07.07 21:55
geht das jetzt so?? ich schau einfach ob in einem der zwei pointer nix drin steht. wenns so ist dann wird das ganze abgebochen.
Oder gibts ne bessere möglichkeit?
lg elundril
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 15.07.07 21:57
Ist denn sichergestellt, dass der Pointer dann nil ist? Oder kann auch nur "Unsinn" drin stehen, als was gerade an der Stelle im Speicher steht.
Außerdem: in der inneren Schleife kannst Du auch weiterhin "rauslaufen".
Wieso läufst Du nicht einfach bis zum Minimum der Seitenlängen?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| if image1.Height < image2.Height then minHeight := image1.Height else minHeight := image2.Height;
for y := 0 to minHeight-1 do ... |
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: So 15.07.07 22:01
stimmt, stimmt, stimmt!
Jop is ne gute idee!
Gib mir noch ein paar tage zeit bitte und ich werd das ganze nochmal überarbeiten.
lg elundril
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 23.07.07 10:39
Baust Du die Änderungen noch ein?
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mo 23.07.07 11:31
ja natürlich! ich hab nur vergessen wegen dem release von SpeedNotes! Sry!!
lg elundril
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mo 30.07.07 01:37
elundril hat folgendes geschrieben: | ja natürlich! ich hab nur vergessen wegen dem release von SpeedNotes! |
Der Release muss echt anstrengend gewesen sein
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Mo 30.07.07 08:33
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 03.07.08 00:19
Moin!
Christian S. hat folgendes geschrieben: | Außerdem: Was passiert, wenn Image1 größer als Image2 ist? Wenn ich richtig sehe, greift man dann auf Speicher zu, von dem man die Finger lassen sollte. |
Christian S. hat folgendes geschrieben: | Wieso läufst Du nicht einfach bis zum Minimum der Seitenlängen?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| if image1.Height < image2.Height then minHeight := image1.Height else minHeight := image2.Height;
for y := 0 to minHeight-1 do ... | |
Leider tritt bei deinem Demo-Programm immer noch eine Exception auf, wenn Image1 größer als Image2 ist. Christian S. hat dir doch bereits einen Vorschlag gemacht, wie du das Problem lösen kannst.
Hast du überhaupt noch Interesse, den FAQ-Beitrag weiterzuentwickeln?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Do 03.07.08 02:13
jop, natürlich, sorry das ich da bis jetzt nichts gemacht habe, Schule ist in den letzten beiden Jahren etwas für mich vor gegangen und da hatte ich keine Zeit. Aber jetzt mit neuem Laptop und mehr Zeit mach ich mich wieder ans werk. danke fürs erinnern.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Tilman
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Mi 23.07.08 00:14
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
elundril
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Do 24.07.08 14:56
Jop, is richtig so. Heut abend kommt dann eh eine neue Version mit den Bugfixes.
Freut mich das es dir hilft.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 06.08.08 00:10
Moin!
Ein weiterer Monat ist seit meiner letzten Anfrage unwiederbringlich im Abgrund der Vergessenheit versunken...
elundril am Do 24.07.08 14:56 hat folgendes geschrieben: | Heut abend kommt dann eh eine neue Version mit den Bugfixes. |
Wie sieht´s aus, kommst du voran?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Tilman
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: Mi 06.08.08 17:17
Hm, möglicherweise dachte eldunril ich sei ein Moderator oder Bibliothekar; natürlich meinte ich mit "ich habs mal so geändert" eigentlich "ich habs mal so geändert - in meinem Projekt". Da ist also noch was zu tun
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|