Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi halbtransparenten text auf TImage? (https://www.delphipraxis.net/32919-halbtransparenten-text-auf-timage.html)

Airblader 29. Okt 2004 16:38

Re: halbtransparenten text auf TImage?
 
Zitat:

Zitat von Dax
Dann nützt dir der Opacity-Wert aber nichts mehr - weil du ja einfach nur die src-Pixel oder die Dest-Pixel kopierst, ohne Alpha-Blend.

Wie meinen?
Ich will den Text selber Transparent haben...mehr nich *langsam verzweifelt* ;)

Wenn ich den bereits transparenten Pixel mit dem Dest-Pixel "verrechne" kommt ja eine ungewollte Farbänderung zustande..oder?

Um mein Vorhaben ganz kurz zu beschreiben:
Eine Art Deckkraft-Funktion wie in Photoshop o.ä.
Nur, dass man hier die Deckkraft nur 1x einstellen können muss und nicht dauernd ändern können muss

/Edit:
Könnte man nicht auch das Format der Bitmap temporär auf 32Bit stellen?

/Edit2:
Meintest du so?
Delphi-Quellcode:
rr := Trunc(((r/255)*opacity) + ((r2/255)*(255-opacity)));
gg := Trunc(((g/255)*opacity) + ((g2/255)*(255-opacity)));
bb := Trunc(((b/255)*opacity) + ((b2/255)*(255-opacity)));

SirThornberry 29. Okt 2004 16:45

Re: halbtransparenten text auf TImage?
 
Soll die Transparenz des TImage erhalten bleiben oder soll zwichen den Buchstaben die Transparenz (vollständige durchsichtigkeit) erhalten bleiben?

Dax 29. Okt 2004 16:46

Re: halbtransparenten text auf TImage?
 
Ja, so meinte ich das. Ansonsten könnte Farbinformation verloregehen..

Airblader 29. Okt 2004 16:52

Re: halbtransparenten text auf TImage?
 
nochmal^^
ich will einfach nur einen text auf ein bild zeichnen.
dieser text soll aber opacity haben, d.h. ich kann sagen, ob er nur zu 50% erscheinen soll...also halt halbtransparent.

SirThornberry 29. Okt 2004 16:57

Re: halbtransparenten text auf TImage?
 
Geduld, Source ist fast fertig... (eigentlich total simpel)

Airblader 29. Okt 2004 17:00

Re: halbtransparenten text auf TImage?
 
Zitat:

Zitat von SirThornberry
Geduld, Source ist fast fertig... (eigentlich total simpel)

Danke :)
Eig. wollt ichs selber machen...aber ich glaub, hier lern ich durch anschauen mehr :?

SirThornberry 29. Okt 2004 17:05

Re: halbtransparenten text auf TImage?
 
Hier mein Meisterwerk, hoffe es ist einigermaßen verständlich.
Delphi-Quellcode:
function GetBlendColor(BaseColor: TColor; BlendColor: TColor; AlphaVal: Byte): TColor;
type
  TMyColor = record
    red: Byte;
    green: Byte;
    blue: Byte;
  end;
var LF1, LF2: TMyColor;
begin
  LF1.red := GetRValue(Basecolor);
  LF1.green := GetGValue(Basecolor);
  LF1.blue := GetBValue(Basecolor);

  LF2.red := (LF1.red * (255-AlphaVal) + GetRValue(Blendcolor) * AlphaVal) div 255;
  LF2.green := (LF1.green * (255-AlphaVal) + GetGValue(Blendcolor) * AlphaVal) div 255;
  LF2.blue := (LF1.blue * (255-AlphaVal) + GetBValue(Blendcolor) * AlphaVal) div 255;
  result := rgb(LF2.red, LF2.green, LF2.blue);
end;

procedure DrawTexttoBitmap1(ADest: TBitmap; AText: String; AFont: TFont; AlphaVal: Byte; APos: TPoint);
var LBmp1: TBitmap;
    LBGColor, LColor1, LColor2: TColor;
    LWdhX, LWdhY: Integer;
begin
  if AText <> '' then
  begin
    LBmp1 := TBitmap.Create;
    LBmp1.Canvas.Font.Assign(AFont);
    LBmp1.Width := LBmp1.Canvas.TextWidth(AText);
    LBmp1.Height := LBmp1.Canvas.TextHeight(AText);
    if AFont.Color = clWhite then
      LBGColor := clBlack
    else
      LBGColor := clWhite;
    LBmp1.Canvas.Brush.Color := LBGColor;
    LBmp1.Canvas.FillRect(Rect(0, 0, LBmp1.Width, LBmp1.Height));
    LBmp1.Canvas.TextOut(0,0, AText);
    LWdhX := 0;
    while (LWdhX < ADest.Width - APos.X) and (LWdhX < LBmp1.Width) do
    begin
      LWdhY := 0;
      while (LWdhY < ADest.Height - APos.Y) and (LWdhY < LBmp1.Height) do
      begin
        LColor1 := LBmp1.Canvas.Pixels[LWdhX, LWdhY];
        if LColor1 <> LBGColor then
        begin
          LColor2 := ADest.Canvas.Pixels[LWdhX + APos.X, LWdhY + APos.Y];
          ADest.Canvas.Pixels[LWdhX + APos.X, LWdhY + APos.Y] := GetBlendColor(LColor2, LColor1, AlphaVal);
        end;
        inc(LWdhY);
      end;
      inc(LWdhX);
    end;
    LBmp1.Free;
  end;
end;
Beispielaufruf (gibt 'Testtext' an Position X: 10 Y: 15 auf dem Bild aus)
Delphi-Quellcode:
  DrawTexttoBitmap1(Image1.Picture.Bitmap, 'Testtext', Font, 50, Point(10, 15));
Alphaval muss ein wert zwischen 0 (Text ist nicht sichtbar) und 255 (Text hat volle Deckkraft) sein

Airblader 29. Okt 2004 17:08

Re: halbtransparenten text auf TImage?
 
Danke :-D

Bin die nächsten Minuten dann erstmal mit lesen und testen beschäftigt.. *fg*

Edit:

DANKÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ :mrgreen:
Funktioniert einwandfrei! Genauso wie ichs wollte :) *auf Knie fall und anbet*

So...nun muss ich mir den Code aber dringstens auch ansehen :)

SirThornberry 29. Okt 2004 17:18

Re: halbtransparenten text auf TImage?
 
Falls den Quelltext jemand nicht versteht - fogendes wird gemacht.
Der Text wird auf ein Bitmap ausgegeben (LBmp1) dabei wird darauf geachtet das die Hintergrundfarbe ungleich der Textfarbe ist. Anschließend wird Pixel für Pixel des Bildes wo die schrift drauf ist (LBmp1) durchgegangen und wenn die Farbe des Pixels ungleich der Hintergrundfarbe ist (also Text an der Stelle ist), wird dieses Pixel mit der Farbe des Hintergrundbildes (ADest) gemicht und dann auf dem Hintergrund (ADest ) ausgegeben.

Airblader 29. Okt 2004 17:23

Re: halbtransparenten text auf TImage?
 
Zitat:

Zitat von SirThornberry
Falls den Quelltext jemand nicht versteht - fogendes wird gemacht.
Der Text wird auf ein Bitmap ausgegeben (LBmp1) dabei wird darauf geachtet das die Hintergrundfarbe ungleich der Textfarbe ist. Anschließend wird Pixel für Pixel des Bildes wo die schrift drauf ist (LBmp1) durchgegangen und wenn die Farbe des Pixels ungleich der Hintergrundfarbe ist (also Text an der Stelle ist), wird dieses Pixel mit der Farbe des Hintergrundbildes (ADest) gemicht und dann auf dem Hintergrund (ADest ) ausgegeben.

Was genau das ist, was ich die ganze zeit zu erklären versuchte :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:59 Uhr.
Seite 2 von 2     12   

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