AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

canvas.rectangle transparent?

Ein Thema von Mattze · begonnen am 28. Apr 2016 · letzter Beitrag vom 29. Apr 2016
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: canvas.rectangle transparent?

  Alt 29. Apr 2016, 13:19
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.
http://www.delphipraxis.net/88775-fa...eraendern.html
Ggf. könntest Du Pixel, die x Helligkeitswerte unter oder über der Texthelligkeit liegen, durch eine neue Hintergrundfarbe ersetzen.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.734 Beiträge
 
Delphi 2007 Professional
 
#12

AW: canvas.rectangle transparent?

  Alt 29. Apr 2016, 13:24
Ich weiß nicht, ob AlphaBlend dafür tauglich ist. Das Verfahren kann ja auch nicht zwischen Vorder- und Hintergrund unterscheiden.
Muss es ja auch nicht. Dem OP geht's darum, den Bereich um den Text hervorzuheben. Das ginge damit IMHO sehr gut.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#13

AW: canvas.rectangle transparent?

  Alt 29. Apr 2016, 13:33
Ich weiß nicht, ob AlphaBlend dafür tauglich ist. Das Verfahren kann ja auch nicht zwischen Vorder- und Hintergrund unterscheiden.
Muss es ja auch nicht. Dem OP geht's darum, den Bereich um den Text hervorzuheben. Das ginge damit IMHO sehr gut.
Und wie soll das gehen? Wenn du über den ganzen Bereich transparent drüber zeichnest ist auch der Text betroffen und verfärbt sich.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.734 Beiträge
 
Delphi 2007 Professional
 
#14

AW: canvas.rectangle transparent?

  Alt 29. Apr 2016, 13:41
Ich weiß nicht, ob AlphaBlend dafür tauglich ist. Das Verfahren kann ja auch nicht zwischen Vorder- und Hintergrund unterscheiden.
Kommt wahrscheinlich auf die Farbgebung der Vorlage an. Im Explorer geht's ja z.B. Ich würde es einfach mal ausprobieren.
@stahli, kannst du mal ein Beispiel zeigen?
Uli Gerhardt

Geändert von uligerhardt (29. Apr 2016 um 13:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: canvas.rectangle transparent?

  Alt 29. Apr 2016, 13:45
Nein, dafür habe ich kein Beispiel.
War nur eine Überlegung.

(Aber das Abdunkeln und Aufhellen von Farben an sich funktioniert super.)
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.734 Beiträge
 
Delphi 2007 Professional
 
#16

AW: canvas.rectangle transparent?

  Alt 29. Apr 2016, 14:13
@stahli, kannst du mal ein Beispiel zeigen?
Nein, dafür habe ich kein Beispiel.
Dich hab ich doch auch gar nicht gemeint, sondern Mattze.
Sorry für die Verwirrung - ich kann nicht lesen.


EDIT: Ich musste es jetzt doch mal ausprobieren. Ich finde, das schaut ganz gut aus. Das hängt aber natürlich vom Hintergrund ab.
2016-04-29-14_22_54-form2.png
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;
Uli Gerhardt

Geändert von uligerhardt (29. Apr 2016 um 14:28 Uhr)
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#17

AW: canvas.rectangle transparent?

  Alt 29. Apr 2016, 15:52
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:
    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;
Kurzbeschreibung: gewünschtes Rechteck des Canvas auf eine Bitmap kopieren.
Canvas färben.
Bitmap transparent zurück auf den Canvas schreiben.

Geht gut und schnell.

Gruß
Mattze
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#18

AW: canvas.rectangle transparent?

  Alt 29. Apr 2016, 17:29
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:
type
  TBGR =
    B: Byte;
    G: Byte;
    R: Byte;
  end;
Im Gegensatz dazu können in TColor RGB-Werte gespeichert werden, das heißt Blau und Rot sind in der Reihenfolge getauscht.

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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 22:29 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