TBitmap abdunkeln und Transparenz erhalten

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

TBitmap abdunkeln und Transparenz erhalten

Beitrag von Komoluna »

Liebes Forum,

ich habe in meinem Projekt ein TBitmap, was ich Prozentual abdunkeln möchte.
Dieses Bitmap hat jedoch transparente (nicht halbtransparent) Pixel, die nach dem Abdunkeln ihre Transparenz verloren haben.
Mein Code sieht zurzeit so aus:

Code: Alles auswählen

    t := Result.TransparentColor;
    w := Result.Width-1;
    h := Result.Height-1;
    For x := 0 To w Do
      For y := 0 To h Do
      Begin
        c := Result.Canvas.Pixels[x, y];
        If (c = t) And Result.Masked Then //<sollte eigentlich das Problem beheben indem es durchsichtige Pixel überspringt, tut es aber nicht...
          Continue;
        RedGreenBlue(c, r, g, b);
        r := round(r / 100 * Brightness)//<- r * Brightness%
        g := round(g / 100 * Brightness);
        b := round(b / 100 * Brightness);
        Result.Canvas.Pixels[x, y] := RGBToColor(r, g, b);
      End;

habe ich mal wieder ein Brett vorm Kopf oder warum bleiben die Pixel nicht Transparent???
(wenn sich das Problem bis morgen nicht aufgelöst hat werde ich ein Minimabeispiel dazu zusammenstellen, heute ist es zu spät dafür.
Gute Nacht)

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TBitmap abdunkeln und Transparenz erhalten

Beitrag von theo »


Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: TBitmap abdunkeln und Transparenz erhalten

Beitrag von Komoluna »

ja, es funktioniert auch alles (mit Transparenz), wenn ich die Zeile mit der Pixelzuweisung auskommentiere.

Also sollen alle Stellen, die Transparent sein sollen die TBitmap.TransparentColor haben...
aber durch die Abfrage if c=t then ... sollten doch Pixel, die mit der TransparenColor identisch sind übersprungen werden, oder habe ich da nen Denkfehler?

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TBitmap abdunkeln und Transparenz erhalten

Beitrag von theo »

Der Lazarus Grafik kommt man mit logischem (intuitivem) Denken nicht auf die Schliche (deshalb hatte ich damals mein OpBitamp gebastelt). :lol:

Ich hatte dir einen Link angehängt. Wo ist denn hier die Logik in deinem Sinne?

Code: Alles auswählen

 
    bmp.SaveToStream(memstream);
    memstream.position := 0;
    bmp.LoadFromStream(memstream);
 


:wink:

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: TBitmap abdunkeln und Transparenz erhalten

Beitrag von Komoluna »

ich lade bitmaps nur aus dateien, daher war loadfromstream bisher noch nicht wichtig für mich.
aber es kann doch nicht so schwer sein, zu bestimmen ob Pixel xy Transparent ist oder nicht, oder?
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TBitmap abdunkeln und Transparenz erhalten

Beitrag von theo »

Komoluna hat geschrieben:ich lade bitmaps nur aus dateien, daher war loadfromstream bisher noch nicht wichtig für mich.
aber es kann doch nicht so schwer sein, zu bestimmen ob Pixel xy Transparent ist oder nicht, oder?


Doch, es kann schwer sein, wie du siehst. :wink:
Lies den Code doch nochmal genau. Das SaveTo-/LoadFromStream ist doch scheinbar sinnlos.
Probier das einfach auch mal aus, nachdem du das BMP manipuliert hast. Es geht nicht darum, woher du das BMP ursprünglich lädst.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: TBitmap abdunkeln und Transparenz erhalten

Beitrag von Komoluna »

Falls du das so meinst:

Code: Alles auswählen

If Brightness < 100 Then
  Begin
    t := Result.TransparentColor;
    w := Result.Width - 1;
    h := Result.Height - 1;
    For x := 0 To w Do
      For y := 0 To h Do
      Begin
        c := Result.Canvas.Pixels[x, y];
        If (c = t) And Result.Masked Then
          Continue;
        RedGreenBlue(c, r, g, b);
        r := round(r / 100 * Brightness);
        g := round(g / 100 * Brightness);
        b := round(b / 100 * Brightness);
        Result.Canvas.Pixels[x, y] := RGBToColor(r, g, b);
      End;
    Try
      memstream := TMemoryStream.Create;
      Result.SaveToStream(memstream);
      memstream.position := 0;
      Result.LoadFromStream(memstream);
    Finally
      memstream.Free;
    End;
  End;

Änderung: nix...
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TBitmap abdunkeln und Transparenz erhalten

Beitrag von theo »

Auch nicht, wenn du nachher nochmal die Transparenz setzt wie im Beispiel?

Code: Alles auswählen

 bmp.Transparent := True;
 bmp.TransparentColor := clFuchsia;


Ich hab's nicht getestet. Mach doch sonst mal ein Beispielprojekt, dann schaue ich mal.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: TBitmap abdunkeln und Transparenz erhalten

Beitrag von Komoluna »

Hab jetzt nochmal ein Minimalbeispiel zusammengestellt...
1. Entpacken und kompilieren
2. Ausführen und beigelegte png Datei auf das Fenster ziehen

Aber jetzt bin ich mit meinem "Pascal am Ende", weder vor der Veränderung(Abdunkelung), noch danach bringt

Code: Alles auswählen

bmp.Transparent := True;
 bmp.TransparentColor := clFuchsia;

etwas...
Dateianhänge
transparenztest.rar
(124.31 KiB) 83-mal heruntergeladen
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TBitmap abdunkeln und Transparenz erhalten

Beitrag von theo »

Bei mit tut das erstmal gar nicht (GTK2). D.h. es wird auch nicht dunkler.

Probier mal so:

Code: Alles auswählen

Procedure TForm1.FormDropFiles(Sender: TObject; Const FileNames: Array Of String);
Var
  p: TPicture;
  x, y, w, h, Brightness: Integer;
  r, g, b: Byte;
  t, c: TColor;
  ca: TCanvas;
  memstream:TMemoryStream;
Begin
  memstream:=TMemoryStream.Create;
  p := TPicture.Create;
  p.LoadFromFile(FileNames[0]);
  p.Bitmap.SaveToStream(memstream);
  memstream.position := 0;
  bmp.LoadFromStream(memstream);
  memstream.free;
  p.Free;
  //Bearbeiten
  ca := bmp.Canvas;
  Brightness := 50;
  t := bmp.TransparentColor;
  Bmp.GetSize(w, h);
  For x := 0 To w - 1 Do
    For y := 0 To h - 1 Do
    Begin
      c :=  bmp.Canvas.Pixels[x, y];
      If (c = t) And bmp.Masked Then
        Continue;
      RedGreenBlue(c, r, g, b);
      r := round(r / 100 * Brightness);
      g := round(g / 100 * Brightness);
      b := round(b / 100 * Brightness);
      bmp.Canvas.Pixels[x, y] := RGBToColor(r, g, b);
    End;
 
  memstream:=TMemoryStream.Create;
  bmp.SaveToStream(memstream);
  memstream.position := 0;
  bmp.LoadFromStream(memstream);
  memstream.free;
  bmp.TransparentColor := t;
  Bmp.Transparent := true;
  Repaint;
End;   


Habe ich jetzt nur so hingehackt, da muss man jeden Schritt nochmal überlegen.
Aber so sieht es bei mir richtig aus.

P.S. ich würde sowas mit TLazIntfImage machen.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: TBitmap abdunkeln und Transparenz erhalten

Beitrag von Komoluna »

Ich benutze Windows 7 64bit und es wird zwar abgedunkelt, aber direkt neben der Figur ist es immernoch Weiß(bzw. Grau nach der Abdunkelung), anstatt Grün

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TBitmap abdunkeln und Transparenz erhalten

Beitrag von theo »

Dann holst du halt die Farbe nochmal:

Code: Alles auswählen

 
.....
  bmp.TransparentColor := Bmp.Canvas.Pixels[1,1];   
  Bmp.Transparent := true;
  Repaint;
End

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: TBitmap abdunkeln und Transparenz erhalten

Beitrag von Komoluna »

Danke, jetzt funktioniert es.
Wenn vor dem Zeichnen/nach der bearbeitung die Zeile

Code: Alles auswählen

 
  bmp.TransparentColor := bmp.Canvas.Pixels[1, 1];

steht, funktioniert es.

Danke theo und allen anderen, die sich mit dem Problem(im stillen) auseinandergesetzt und mir geholfen haben...

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Antworten