![]() |
AW: canvas.rectangle transparent?
Ich weiß nicht, ob AlphaBlend dafür tauglich ist. Das Verfahren kann ja auch nicht zwischen Vorder- und Hintergrund unterscheiden.
Evtl. bringt Dich die Helligkeit weiter. ![]() Ggf. könntest Du Pixel, die x Helligkeitswerte unter oder über der Texthelligkeit liegen, durch eine neue Hintergrundfarbe ersetzen. |
AW: canvas.rectangle transparent?
Zitat:
|
AW: canvas.rectangle transparent?
Zitat:
|
AW: canvas.rectangle transparent?
Zitat:
@stahli, kannst du mal ein Beispiel zeigen? |
AW: canvas.rectangle transparent?
Nein, dafür habe ich kein Beispiel.
War nur eine Überlegung. (Aber das Abdunkeln und Aufhellen von Farben an sich funktioniert super.) |
AW: canvas.rectangle transparent?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
Sorry für die Verwirrung - ich kann nicht lesen. :wall: :mrgreen: EDIT: Ich musste es jetzt doch mal ausprobieren. Ich finde, das schaut ganz gut aus. Das hängt aber natürlich vom Hintergrund ab. Anhang 45240
Delphi-Quellcode:
// AlphaBlendRect: Zeichnet das Rechteck ARect alphageblendet in der Farbe AColor
// und der Intensität AIntensity (0 = durchsichtig, 255 = deckend) auf den übergebenen DC. procedure AlphaBlendRect(DC: HDC; const ARect: TRect; AColor: TColor; AIntensity: Byte); var Bitmap: TBitmap; BlendParams: TBlendFunction; rClip, rBlend: TRect; function GetBlendColor: TRGBQuad; function PreMult(b: Byte): Byte; begin Result := (b * AIntensity) div $FF; end; var cr: TColorRef; begin cr := ColorToRGB(AColor); Result.rgbBlue := PreMult(GetBValue(cr)); Result.rgbGreen := PreMult(GetGValue(cr)); Result.rgbRed := PreMult(GetRValue(cr)); Result.rgbReserved := AIntensity; end; begin GetClipBox(DC, rClip); if not Windows.IntersectRect(rBlend, rClip, ARect) then Exit; Bitmap := TBitmap.Create; try Bitmap.PixelFormat := pf32bit; Bitmap.SetSize(1, 1); PRGBQuad(Bitmap.ScanLine[0])^ := GetBlendColor; BlendParams.BlendOp := AC_SRC_OVER; BlendParams.BlendFlags := 0; BlendParams.SourceConstantAlpha := $FF; BlendParams.AlphaFormat := AC_SRC_ALPHA; Windows.AlphaBlend( DC, rBlend.Left, rBlend.Top, rBlend.Right - rBlend.Left, rBlend.Bottom - rBlend.Top, Bitmap.Canvas.Handle, 0, 0, 1, 1, BlendParams); finally Bitmap.Free; end; end; procedure TForm2.PaintBox1Paint(Sender: TObject); var r: TRect; begin PaintBox1.Canvas.Brush.Color := clWhite; PaintBox1.Canvas.Pen.Color := clBlack; PaintBox1.Canvas.FillRect(ClientRect); PaintBox1.Canvas.TextOut(100, 100, 'Alarma! Ohne Highlighting'); PaintBox1.Canvas.TextOut(100, 200, 'Alarma! Mit Highlighting'); r := Bounds(50, 150, 200, 100); AlphaBlendRect(PaintBox1.Canvas.Handle, r, clRed, 50); PaintBox1.Canvas.Pen.Color := clRed; PaintBox1.Canvas.Brush.Style := bsClear; PaintBox1.Canvas.Rectangle(r); end; |
AW: canvas.rectangle transparent?
Hallo,
vielen Dank für Eure Ratschläge. Alphablending hatte ich auch mal ausprobiert. Sieht hübsch aus, hat aber den Nachteil, dass es auch den Text langsam "ausblendet" (abhängig von der Intensität). Ich habe das jetzt auf eine ganz einfache Weise gelöst, musste dazu aber doch eine Bitmap zu Hilfe nehmen:
Delphi-Quellcode:
Kurzbeschreibung: gewünschtes Rechteck des Canvas auf eine Bitmap kopieren.
bmp:=Tbitmap.Create;
try bmp.Height:=itemrect.Bottom-itemrect.Top; bmp.Width:=itemrect.Right-itemrect.Left; bmp.Canvas.CopyRect(rect(0,0,bmp.width,bmp.Height),targetcanvas,itemrect); bmp.Transparent:=true; bmp.TransparentColor:=clWhite; targetcanvas.Brush.Color:=clGradientActiveCaption; targetcanvas.fillrect(itemrect); //falls Rahmen gewünscht: Rectangle(itemrect); targetcanvas.Draw(itemrect.Left,itemrect.Top,bmp); finally bmp.Free end; Canvas färben. Bitmap transparent zurück auf den Canvas schreiben. Geht gut und schnell. Gruß Mattze |
AW: canvas.rectangle transparent?
Hallo,
Ich glaube hier besteht noch Informationsbedarf, was den ein Canvas eigentlich ist. Der Canvas repräsentiert ein reines Ausgabegerät, das mit Zeichenbefehlen gesteuert wird. Das heißt das nachträgliche Lesen von dem was ausgegeben wurde, ist eigentlich nicht vorgesehen. Ein Beispiel wäre ein Plotter, der jeden Zeichenbefehl sofort in Stiftbewegungen umsetzt. Die Grafikkarte hat natürlich eigenen Speicher, in dem das Ergebnis der Zeichenbefehle vor der Ausgabe zwischengespeichert wird. Aber dieser Speicher muss nicht direkt vom Hauptprozessor erreichbar sein. Die Zeichenbefehle können auch von Prozessoren auf der Grafikkarte ausgeführt werden. Selbst wenn die Grafikkarte die Möglichkeit hat, Teile ihres Speichers in der Adressraum des Hauptprozessors einzublenden, so sind das Adressbereiche auf die nur der Grafikkartentreiber zugreifen kann. Um trotzdem die Möglichkeit zu haben auf den Grafikspeichers zuzugreifen, wurden geräteabhängige Bitmap geschaffen. Mit der BitBlt-Funktion können Teile des Grafikspeichers in diese Bitmaps und von dort wieder zurück kopiert werden. Allerdings liegen die Daten dort in einem Format vor, daß der Grafiktreiber bestimmt. Für Zeichenbefehle auf diese Bitmaps kann ein gerätekompatiblen Speichercancvas erzeugt werden. Um die Daten direkt im Speicher bearbeiten zu können, muss diese erst in ein geräteunabhängiges Standardformat überführt werden. Für diese Formate ist genau definiert wie die Daten im Speicher abgelegt sind. Im Format pf24Bit werden für jedes Pixel 3 Byte abgelegt, jedes Byte steht für einen Farbanteil in der Reihenfolge Blau, Grün, Rot.
Delphi-Quellcode:
Im Gegensatz dazu können in TColor RGB-Werte gespeichert werden, das heißt Blau und Rot sind in der Reihenfolge getauscht.
type
TBGR = B: Byte; G: Byte; R: Byte; end; Um auf das Problem zurück zu kommmen, mir scheint die beste Lösung zu sein: - Bitmap der entsprechenden Größe erzeugen - den Bildauschnitt kopieren - Bitmap verändern - Bitmap wieder auf den ursprüngliche Canvas zeichnen Wie ich sehe ist das auch deine Lösung. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz