AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi halbtransparenten text auf TImage?
Thema durchsuchen
Ansicht
Themen-Optionen

halbtransparenten text auf TImage?

Ein Thema von Airblader · begonnen am 29. Okt 2004 · letzter Beitrag vom 29. Okt 2004
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Airblader
Airblader

Registriert seit: 29. Okt 2004
Ort: Geislingen an der Steige
742 Beiträge
 
#1

halbtransparenten text auf TImage?

  Alt 29. Okt 2004, 15:45
Hi
Ich plage mich seit gestern damit rum, einen text mit einer bestimmten Deckkraft auf ein TImage zu zeichnen.
Bisher hab ich TextOut, nur da gibts keine transparenz.
Nunja...mir wurden 2 Möglichkeiten dargestellt:
- Pixelmanipulation
- AlphaBlending
Wobei eins dem anderem sehr ähnlich kommt.

Ich habe mal als "Grundgerüst" das zusammengebastelt:

Delphi-Quellcode:
function trans_text(const src, dest: TBitmap; opacity: real): Boolean;
var
w,h: integer;
color, color2: Longint;
r,g,b: byte;
r2,g2,b2: byte;
rr,gg,bb: byte;
begin
    for h:=0 to src.Height do
    begin
        for w:=0 to src.Width do
        begin
            color := ColorToRGB(src.Canvas.pixels[w,h]);
            r := GetRValue(color);
            g := GetGValue(color);
            b := GetBValue(color);
            color2 := ColorToRGB(dest.Canvas.pixels[w,h]);
            r2 := GetRValue(color2);
            g2 := GetGValue(color2);
            b2 := GetBValue(color2);


            rr := (r*r2) / 255;
            gg := (g*g2) / 255;
            bb := (b*b2) / 255;

            dest.Canvas.pixels[w,h] := RGB(rr,gg,bb);
        end;
    end;
end;
Nunja.
2 Probleme sind offensichtlich:

1. Die richtige Formel zur Manipulation
2. Nur Pixel manipulieren, die nich transparent sind

Übrigens:
src ist ein TImage, auf dem ich mit TextOut schreib, dest ein TImage, wo das ganze dann drauf soll (schon ein anderes bild vorhanden)
und nein, ich meine nicht den weissen kasten, den man mit bsClear wegbekommt.
ich meine, dass die schrift eben transparent werden soll, mit einstellbarer deckkraft (opacity)

Kann mir jmd helfen?
Ingo Bürk
Es nimmt der Augenblick, was Jahre geben.

Johann Wolfgang von Goethe
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: halbtransparenten text auf TImage?

  Alt 29. Okt 2004, 15:55
Erstmal Herzlich Willkommen in der DP!

Soweit ich weiss, gibt es nur 256 Levels der Transparenz, also ist Opacity: Real eher ein Byte.
Übrigens ist dein Code falsch: Die Transaprenz errechnet sich anders.

Die Grundlagen sind recht simpel: Du nimmst dir das src-Pixel, teilst den Farbwert durch 255 (da kommst du um Real nicht herum) und multiplizierst es dann mit Opacity. Dann machst du das selbe mit den Dest-Pixel, nur multiplizierst du mit (255-Opacity). Am Ende werden beide Werte (jeweils R, G und B) addiert, und du hast ein Transparentes Pixel.
  Mit Zitat antworten Zitat
Benutzerbild von Airblader
Airblader

Registriert seit: 29. Okt 2004
Ort: Geislingen an der Steige
742 Beiträge
 
#3

Re: halbtransparenten text auf TImage?

  Alt 29. Okt 2004, 16:07
Erstmal Danke
Ja, war nur eben zusammengeschsutert..und wie gesagt: Dass die Formel falsch ist, war mir klar

Ich werde jetzt mal schauen was ich hinbekomm

air
Ingo Bürk
Es nimmt der Augenblick, was Jahre geben.

Johann Wolfgang von Goethe
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

Re: halbtransparenten text auf TImage?

  Alt 29. Okt 2004, 16:10
Allerdings solltest du bei dem obigen Vorschlag beachten, dass du nicht weisst, welches Pixel bereits transparent war und nachher nicht weisst, welches Pixel welchen Transparenzwert besitzt.
  Mit Zitat antworten Zitat
Benutzerbild von Airblader
Airblader

Registriert seit: 29. Okt 2004
Ort: Geislingen an der Steige
742 Beiträge
 
#5

Re: halbtransparenten text auf TImage?

  Alt 29. Okt 2004, 16:18
Zitat von Dax:
Allerdings solltest du bei dem obigen Vorschlag beachten, dass du nicht weisst, welches Pixel bereits transparent war und nachher nicht weisst, welches Pixel welchen Transparenzwert besitzt.
stimmt....das war das, was ich meinte.
aber wie frage ich ab, ob der aktuelle pixel bereits transparent ist?

hab es nun so:

Delphi-Quellcode:
function text_opacity(const src,dest: TBitmap; opacity: byte): Boolean;

[...]

function TForm1.text_opacity(const src,dest: TBitmap; opacity: byte): Boolean;
var
w,h: integer;
col, col2: Longint;
r1, g1, b1: byte;
r2, g2, b2: byte;
rr, gg, bb: byte;
begin
        for h:=0 to src.Height do
        begin
                for w:=0 to src.Width do
                begin
                        // Src:
                        col := ColorToRGB(src.Canvas.Pixels[w,h]); // Pixelfarbe
                        // Nun R G und B Wert holen:
                        r1 := GetRValue(col);
                        g1 := GetGValue(col);
                        b1 := GetBValue(col);

                        // Dest:
                        col2 := ColorToRGB(dest.Canvas.Pixels[w,h]); // Pixelfarbe
                        // Nun R G und B Wert holen:
                        r2 := GetRValue(col2);
                        g2 := GetGValue(col2);
                        b2 := GetBValue(col2);

                        // Neue RGB Werte errechnen
                        rr := ((r/255)*opacity) + (r2*(255-opacity));
                        gg := ((g/255)*opacity) + (g2*(255-opacity));
                        bb := ((b/255)*opacity) + (b2*(255-opacity));

                        // Pixel neu zeichnen
                        dest.Canvas.Pixels[w,h] := RGB(rr,gg,bb);
                end;
        end;
end;
air

P.S. Ne dumme Frage...ist mein Stil ordentlich?
Ingo Bürk
Es nimmt der Augenblick, was Jahre geben.

Johann Wolfgang von Goethe
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

Re: halbtransparenten text auf TImage?

  Alt 29. Okt 2004, 16:20
Der Stil ist in Ordnung, allerdings musst du die x2-Werte auch noch durch 255 Teilen (fehlt das in meiner Erklärung?).
Und: Der einzige Weg, die Transparenz eines Pixel abzufragen, ist der Alphakanal, also die letzten 8 Bit bei einer 32Bit-Bitmap.
  Mit Zitat antworten Zitat
Benutzerbild von Airblader
Airblader

Registriert seit: 29. Okt 2004
Ort: Geislingen an der Steige
742 Beiträge
 
#7

Re: halbtransparenten text auf TImage?

  Alt 29. Okt 2004, 16:23
hm hups..überlesen

OK....ich hab halt nur die 24er Bitmap...is ja klar.
D.h. es gibt keinen Weg?
Dann wäre der Rest ja auch umsonst *fg*

Mir fällt nur eine Möglichkeit ein:
Ich gebe beim Funktionsaufruf noch mit an, welche Farbe transparent sein soll.
D.h. ich habe bei der src-bmp eine Hintergrundfarbe, die je nach textfarbe anders ist.
Diese geb ich mit an.
Dann frag ich bevor ich manipuliere ab, ob der Pixel die gelieferte Farbe hat.

Wäre das eine Möglichkeit?

air

P.S.
Aktuell:
Delphi-Quellcode:
function TForm1.text_opacity(const src,dest: TBitmap; opacity: byte): Boolean;
var
w,h: integer;
col, col2: Longint;
r1, g1, b1: byte;
r2, g2, b2: byte;
rr, gg, bb: byte;
begin
        for h:=0 to src.Height do
        begin
                for w:=0 to src.Width do
                begin
                        // Src:
                        col := ColorToRGB(src.Canvas.Pixels[w,h]); // Pixelfarbe
                        // Nun R G und B Wert holen:
                        r1 := GetRValue(col);
                        g1 := GetGValue(col);
                        b1 := GetBValue(col);

                        // Dest:
                        col2 := ColorToRGB(dest.Canvas.Pixels[w,h]); // Pixelfarbe
                        // Nun R G und B Wert holen:
                        r2 := GetRValue(col2);
                        g2 := GetGValue(col2);
                        b2 := GetBValue(col2);

                        // Neue RGB Werte errechnen
                        rr := ((r/255)*opacity) + ((r2/255)*(255-opacity));
                        gg := ((g/255)*opacity) + ((g2/255)*(255-opacity));
                        bb := ((b/255)*opacity) + ((b2/255)*(255-opacity));

                        // Pixel neu zeichnen
                        dest.Canvas.Pixels[w,h] := RGB(rr,gg,bb);
                end;
        end;
end;
Ingo Bürk
Es nimmt der Augenblick, was Jahre geben.

Johann Wolfgang von Goethe
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#8

Re: halbtransparenten text auf TImage?

  Alt 29. Okt 2004, 16:28
Du willst nur eine bestimmte Farbe transparent machen? Das geht ohne Probleme.

Ich sehe grade, in deinem Code ist noch ein Fehler: Der Operator / liefert Real-Ergebnisse zurück, du musst also bein den Pixelberechnungen den Fliesskommateil noch mit Delphi-Referenz durchsuchenTrunc abschneiden.
  Mit Zitat antworten Zitat
Benutzerbild von Airblader
Airblader

Registriert seit: 29. Okt 2004
Ort: Geislingen an der Steige
742 Beiträge
 
#9

Re: halbtransparenten text auf TImage?

  Alt 29. Okt 2004, 16:31
Nein.
Ich will ja einen schlichten Text auf ein Bild malen.
Da ich im 24er Bitmap die Transparenz aber nicht abfragen kann,
könnte ich doch in dem src-Bitmap als Hintergrundfarbe eine Farbe setzen, die ich beim Funktionsaufruf angebe.

So kann ich anstatt die Transparenz abzufragen, die gegebene Farbe abfragen.
Wenn der akt. Pixel dieser Farbe entspricht, bekommt der Pixel den Farbwert der Dest-Bitmap die diesem Pixel entspricht.

Hoffe nun geklärt zu haben

/edit:
mit Trunc:

Delphi-Quellcode:
function TForm1.text_opacity(const src,dest: TBitmap; opacity: byte): Boolean;
var
w,h: integer;
col, col2: Longint;
r1, g1, b1: byte;
r2, g2, b2: byte;
rr, gg, bb: byte;
begin
        for h:=0 to src.Height do
        begin
                for w:=0 to src.Width do
                begin
                        // Src:
                        col := ColorToRGB(src.Canvas.Pixels[w,h]); // Pixelfarbe
                        // Nun R G und B Wert holen:
                        r1 := GetRValue(col);
                        g1 := GetGValue(col);
                        b1 := GetBValue(col);

                        // Dest:
                        col2 := ColorToRGB(dest.Canvas.Pixels[w,h]); // Pixelfarbe
                        // Nun R G und B Wert holen:
                        r2 := GetRValue(col2);
                        g2 := GetGValue(col2);
                        b2 := GetBValue(col2);

                        // Neue RGB Werte errechnen
                        rr := (Trunc(r/255)*opacity) + (Trunc(r2/255)*(255-opacity));
                        gg := (Trunc(g/255)*opacity) + (Trunc(g2/255)*(255-opacity));
                        bb := (Trunc(b/255)*opacity) + (Trunc(b2/255)*(255-opacity));

                        // Pixel neu zeichnen
                        dest.Canvas.Pixels[w,h] := RGB(rr,gg,bb);
                end;
        end;
end;
Ingo Bürk
Es nimmt der Augenblick, was Jahre geben.

Johann Wolfgang von Goethe
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#10

Re: halbtransparenten text auf TImage?

  Alt 29. Okt 2004, 16:34
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.
Und: Die Funktion, die du suchst, gibt es schon. Delphi-Referenz durchsuchenTBitmap.TransparentColor könnte dir als Anhaltspunkt dienen.

Ausserdem würde ich dir raten, erst am Ende der Transparenzrechnung zu runden, damit möglichst wenig Information verlorengeht.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:33 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