AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bmp+Farbe mit "or" verknüpfen - kein Copymode vorhanden
Thema durchsuchen
Ansicht
Themen-Optionen

Bmp+Farbe mit "or" verknüpfen - kein Copymode vorhanden

Ein Thema von Cöster · begonnen am 19. Dez 2006 · letzter Beitrag vom 20. Dez 2006
Antwort Antwort
Seite 2 von 2     12   
Muetze1
(Gast)

n/a Beiträge
 
#11

Re: Bmp+Farbe mit "or" verknüpfen - kein Copymode

  Alt 19. Dez 2006, 20:27
Zitat von Khabarakh:
Mir ist auch nicht ganz klar, wofür du das temporäre Bitmap benötigst.
BitBlt() weiss nichts vom TransparentColor etc und beachtet dies nicht. Draw() hingegen von Delphi macht dies entsprechend. (Was logisch ist, da Delphi intern gehandelte Eigenschaft)
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#12

Re: Bmp+Farbe mit "or" verknüpfen - kein Copymode

  Alt 19. Dez 2006, 20:31
Ob das wirklich schneller ist als das Blending direkt in die Schleife zu packen?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#13

Re: Bmp+Farbe mit "or" verknüpfen - kein Copymode

  Alt 19. Dez 2006, 20:33
Zitat von Khabarakh:
Ob das wirklich schneller ist als das Blending direkt in die Schleife zu packen?
Stimmt schon. Direkt in der Schleife die Pixeldaten berechnen, das Ergebnis mit dem TransparentColor Wert vergleichen und nur bei Ungleichheit direkt in das Ausgabebild zuweisen. Durch das lineare Durchlaufen könnte man sogar recht bequem mit den Einzel-Pointern arbeiten (PRGBQuad).

/EDIT: Naja, aber dann müsste ja noch Dest von der Farbtiefe her angepasst werden. Ich habe dies einfach mal in Quellcode gefasst und gemacht. Ob es schneller ist, kA - müsste man(n) ausprobieren...

Delphi-Quellcode:
// kopiert "Src or Color" an die Position (AX, AY) des Dest-Bitmaps
Procedure DrawOr(Const Dest: TBitmap; Const AX, AY: Integer; Const Src: TBitmap; Const Color: TColor);
Var
  lBuffer: TBitmap;
  DstP, SrcP: PRGBQuad;
  X, Y: Integer;
  lTransColor,
  lNewColor: TRGBQuad;
  lColor: TRGBTriple;
Begin
    // Ok, Src könnte ja ein DDB sein und darf vllt. nicht verändert werden. Daher bleib ich mal bei der Kopie
  lBuffer := TBitmap.Create;
  Try
    lBuffer.SetSize(Src.Width, Src.Height); // D5 und D7 kennen es nicht ...
    BitBlt(lBuffer.Canvas.Handle, 0, 0, lBuffer.Width, lBuffer.Height, Src.Canvas.Handle, 0, 0, SRCCOPY);
    lBuffer.PixelFormat := pf32Bit;
    Dest.PixelFormat := pf32Bit; // diese Veränderung noch an Dest

    With lTransColor Do
    Begin
      rgbRed := GetRValue(ColorToRGB(Src.TransparentColor));
      rgbGreen := GetGValue(ColorToRGB(Src.TransparentColor));
      rgbBlue := GetBValue(ColorToRGB(Src.TransparentColor));
      rgbReserved := 0;
    End;
    With lColor Do
    Begin
      rgbtRed := GetRValue(ColorToRGB(Color));
      rgbtGreen := GetGValue(ColorToRGB(Color));
      rgbtBlue := GetBValue(ColorToRGB(Color));
    End;

    For Y := 0 To Pred(lBuffer.Height) Do
    Begin
       SrcP := lBuffer.ScanLine[Y];
       DstP := Dest.ScanLine[Y + AY];
       Inc(DstP, AX);

       For X := 0 To Pred(lBuffer.Width) Do
       Begin
         lNewColor.rgbRed := SrcP^.rgbRed Or lColor.rgbtRed;
         lNewColor.rgbGreen := SrcP^.rgbGreen Or lColor.rgbtGreen;
         lNewColor.rgbBlue := SrcP^.rgbBlue Or lColor.rgbtBlue;
         lNewColor.rgbReserved := 0;

         If Not ( Src.Transparent And CompareMem(@lNewColor, @lTransColor, SizeOf(TRGBQuad)) ) Then
         Begin
           //lNewColor.rgbReserved := SrcP^.rgbReserved; // ??? Alpha Wert Original belassen?
           DstP^ := lNewColor;
         End;

         Inc(SrcP);
         Inc(DstP);
       End;
    End;
  Finally
    lBuffer.Free;
  End;
End;
Nur geschrieben - nicht getestet!
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#14

Re: Bmp+Farbe mit "or" verknüpfen - kein Copymode

  Alt 19. Dez 2006, 21:24
Hi!
Zitat von Cöster:
Es gibt ja jede Menge verschiedene CopyModes (SRCCOPY, ...), aber ich habe keinen gefunden, der das Source-Bitmap mittels "or" mit einer Farbe (z.B. Brush.Color des Dest-Images) verknüpft.
cmSrcPaint sollte helfen, wenn man die Ziel-Bitmap geeignet vorbereitet:

Delphi-Quellcode:
procedure DrawOr (const Dest: TBitmap; AX, AY: Integer; const Src: TBitmap; Color: TColor);
begin
  with Dest.Canvas do
    begin
      Brush.Style := bsSolid;
      Brush.Color := Color;
      FillRect (Rect(AX, AY, AX + Src.Width, AY + Src.Height));
      CopyMode := cmSrcPaint;
      Draw (AX, AY, Src);
      CopyMode := cmSrcCopy;
    end;
end;
Gruß Hawkeye
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#15

Re: Bmp+Farbe mit "or" verknüpfen - kein Copymode

  Alt 20. Dez 2006, 12:15
@ Hawkeye: So ließe sich allerdings keine Transparenz realisieren.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#16

Re: Bmp+Farbe mit "or" verknüpfen - kein Copymode

  Alt 20. Dez 2006, 12:19
Zitat von Cöster:
@ Hawkeye: So ließe sich allerdings keine Transparenz realisieren.
Darum ging es ihm auch nicht. Du hattest keinen COPYMODE mit OR gefunden, den hat er dir genannt (also bei dir die Schleife). Das was du nach der Schleife machst, also Transparenz setzen und mit Draw übertragen, dass ist dann doch weiterhin möglich. Hawkeye hat hier nicht behauptet deine komplette Routine damit zu erschlagen sondern nur den von dir vermissten CopyMode mit OR.
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Bmp+Farbe mit "or" verknüpfen - kein Copymode

  Alt 20. Dez 2006, 13:01
Dass es keine Copy-Modes mit Or gibt, hab ich nicht behauptet (MergePaint, NotSrcErase, PatPaint, SrcPaint). Ich meinte nur, dass es keinen CopyMode gibt, der ein Bmp mit or mit einer Farbe kombiniert (wie das andere CopyModes mit der Brush.Color tun, allerdings mit anderen Operatoren bzw. verknüpft direkt danach nochmal mit dem Dest-Bmp).

Ich denke für "Color or Transparent-Bitmap" guck ich mir deinen Beispielcode nochmal an (ließe sich allerdings auch noch optimieren, z.B. wird immer wieder auf Transparent geprüft. Außerdem könnte es eine Zugriffsverletzung geben, wenn das Src-Bmp nicht vollständig ins Dest-Bmp passt).
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#18

Re: Bmp+Farbe mit "or" verknüpfen - kein Copymode

  Alt 20. Dez 2006, 13:18
Zitat von Cöster:
Dass es keine Copy-Modes mit Or gibt, hab ich nicht behauptet (MergePaint, NotSrcErase, PatPaint, SrcPaint). Ich meinte nur, dass es keinen CopyMode gibt, der ein Bmp mit or mit einer Farbe kombiniert (wie das andere CopyModes mit der Brush.Color tun, allerdings mit anderen Operatoren bzw. verknüpft direkt danach nochmal mit dem Dest-Bmp).
Was dir Hawkeye nun geliefert hat.

Zitat von Cöster:
Ich denke für "Color or Transparent-Bitmap" guck ich mir deinen Beispielcode nochmal an (ließe sich allerdings auch noch optimieren, z.B. wird immer wieder auf Transparent geprüft. Außerdem könnte es eine Zugriffsverletzung geben, wenn das Src-Bmp nicht vollständig ins Dest-Bmp passt).
Zugriffsverletzung: glaube ich nicht. Die Bitmap Daten liegen im Anwendungsbereich und würden entweder die vorhergehenden Scanlines überschreiben bzw. anderen belegten Speicher, aber zu einer AV müsste man schon Glück haben - aber eine Überprüfung sollte sonst vorher geschehen.

Die Überprüfung auf Transparent sollte nicht viel ausmachen - ob da eine lokale Variable noch was rausholt ist fraglich. Grundlegend ging es nur darum die Ideen zusammen zu fassen und nicht fertigen Code zu präsentieren - wie geschrieben: ungetestet!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz