Autor Beitrag
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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.

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:
34:
35:
36:
procedure AlphaImgs(Image1, Image2: TGraphic; ResultBitmap: TBitmap; AlphaValue: Byte);
type pixel = Array [0..2of 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 616
Erhaltene Danke: 33

Win XP, Vista, 7
Delphi 5 Prof., BDS 2006 Prof. RAD Studio XE
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Do 29.03.07 23:44 
ups stimmt! :oops: sry!

lg el

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
elundril Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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?

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: So 15.07.07 22:01 
:autsch: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Mo 23.07.07 11:31 
ja natürlich! ich hab nur vergessen wegen dem release von SpeedNotes! Sry!!

lg elundril
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 30.07.07 01:37 
user profile iconelundril hat folgendes geschrieben:
ja natürlich! ich hab nur vergessen wegen dem release von SpeedNotes!
Der Release muss echt anstrengend gewesen sein :mrgreen:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
elundril Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Mo 30.07.07 08:33 
user profile iconChristian S. hat folgendes geschrieben:
user profile iconelundril hat folgendes geschrieben:
ja natürlich! ich hab nur vergessen wegen dem release von SpeedNotes!
Der Release muss echt anstrengend gewesen sein :mrgreen:


3 Versionen am ersten Tag sind nichts ungewöhnliches! Frag Microsoft! :lol:

lg elundril
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 03.07.08 00:19 
Moin!

user profile iconChristian 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.
user profile iconChristian S. hat folgendes geschrieben:
Wieso läufst Du nicht einfach bis zum Minimum der Seitenlängen?
ausblenden 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. user profile iconChristian S. hat dir doch bereits einen Vorschlag gemacht, wie du das Problem lösen kannst. :nixweiss:

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Mi 23.07.08 00:14 
user profile iconelundril hat folgendes geschrieben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
      for x:= 0 to bmpImg1.width-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;



funzt nicht, habs mal so geändert, ist das richtig?

ausblenden Delphi-Quelltext
1:
2:
3:
  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);


Ansonsten super Sache, genau das was ich gerade brauche =) hab allerdings die Parameter auf TBitmap geändert anstelle von TGraphic.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
elundril Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 06.08.08 00:10 
Moin!

Ein weiterer Monat ist seit meiner letzten Anfrage unwiederbringlich im Abgrund der Vergessenheit versunken... :)
user profile iconelundril 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: 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)