AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

canvas.rectangle transparent?

Ein Thema von Mattze · begonnen am 28. Apr 2016 · letzter Beitrag vom 29. Apr 2016
Antwort Antwort
Mattze

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

canvas.rectangle transparent?

  Alt 28. Apr 2016, 14:59
Hallo,

ich weiß, das Thema gibt es oft, aber irgendwie finde ich nichts passendes und mit einer transparenten Bitmap scheint es mir sehr, "mit Kanonen auf Spatzen schießen" zu sein.

Mein Problem:
Auf einem Canvas wurde ein Text ausgegeben. Ich kenne diesen Text nicht.
Ich weiß lediglich das Rechteck, in dem er steht. (Allerdings weiß ich auch nicht, wie er da drin steht.)
Dieses Rechteck würde ich gerne mit einer anderen Farbe füllen, so, dass der Text lesbar bleibt.
Sozusagen würde ich also den Text gerne mit einem eingefärbten Hintergrund hervorheben.

Wie kann man das am besten schnell und effizient machen?

Gruß
Mattze
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#2

AW: canvas.rectangle transparent?

  Alt 28. Apr 2016, 17:46
Da die Pixel des Textes an den Ecken und Schrägen z.T. halbtransparent gezeichnet sind, scheint dort der Hintergrund durch.
Das erschwert die Sache etwas. Ist der Text schwarz gezeichnet, kann man diesen Umstand nutzen.

In diesem Beispiel wird nur die Helligkeit des Ausgangsbildes übernommen.
Die graue Bereiche werden eingefärbt.
Weiße oder schwarze Flächen bleiben unverändert.
Delphi-Quellcode:
// Pixelformat pf24Bit
// NewHue 0..100
// NewSaturation 0..100

var
  NewHue, NewSaturation, Hue, Luminance, Saturation: Word;
  p: ^TBGR;
  c: TColor;
  x, y: Integer;
begin

{...}
    for y := 0 to Height - 1 do
    begin
      p := ScanLine[y];
      for x := 0 to Width - 1 do
      begin
        c := RGB(p^.R, p^.G, p^.B);
        ColorRGBToHLS(c, Hue, Luminance, Saturation);
        c := ColorHLSToRGB(NewHue, Luminance, NewSaturation);
        p^.B := GetBValue(c);
        p^.G := GetGValue(c);
        p^.R := GetRValue(c);
        Inc(p);
      end;
    end;
{...}
Alternativ könnte man z.B. die Helligkeit anheben (z.B. Luminance := Round(Luminance * 0.2) ).
  Mit Zitat antworten Zitat
Mattze

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

AW: canvas.rectangle transparent?

  Alt 28. Apr 2016, 19:22
Vielen Dank für die Antwort.

Ich glaube, ich muss betonen, dass ich mit Delphi 7 pro arbeite.

Also: Was ist TBGR und woher kriege ich ein Scanline ohne bitmap?
(TBGR gibt's in meiner Hilfe nicht und Scanline kennt er nur als Methode einer Bitmap.)

Das Problem dürfte sein, wie ich da eine neue Farbe reinkriege.

Gruß
Mattze
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: canvas.rectangle transparent?

  Alt 28. Apr 2016, 20:18
(TBGR gibt's in meiner Hilfe nicht und Scanline kennt er nur als Methode einer Bitmap.)
Ohne das ich das jetzt kenne, aber schonmal mit TRGB probiert? Farben werden normalerweise mit RGB angegeben. Kann natürlich sein, dass ich mich jetzt im Bezug auf diese Funktion vertue.
  Mit Zitat antworten Zitat
Mattze

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

AW: canvas.rectangle transparent?

  Alt 29. Apr 2016, 06:38
Das ist mir natürlich auch aufgefallen und selbstverständlich habe ich das auch probiert.
Ich hab's nur nicht explizit geschrieben, weil es ein BGR wohl manchmal auch gibt.

Es sei denn, dort, wo ich es gelesen habe, hat man sich verschrieben.

Wobei das Scanline-Problem so oder so bleibt!

Interessant ist, dass zu diesem Problem kaum jemand etwas sagen kann (oder will).
Schade!

Gruß
Mattze
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.687 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: canvas.rectangle transparent?

  Alt 29. Apr 2016, 08:57
Ich habe mich anfangs zurück gehalten, weil ich glaubte das Problem nicht richtig verstanden zu haben. Aber okay: Für mich hört sich das so an, als willst du doch bloß einfach ein Rechteck auf deinen Canvas malen oder? Also einfach Canvas.Pen und .Brush auf das gewünschte einstellen, und mit Canvas.Rectangle() den Bereich übermalen. Wo da jetzt genau Transparenz mit rein spielt ist mir nicht wirklich klar. Bzw. bin ich nicht sicher wirklich das Problem erkannt zu haben, weil die genannte Lösung hört sich für mich zu einfach an, als dass du da nicht drauf gekommen wärst
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:15 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 by Thomas Breitkreuz