Einzelnen Beitrag anzeigen

Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Bitmaps in Transparenz ausblenden lassen

  Alt 20. Aug 2014, 21:15
Du kannst z.B. diese Funktion, die voraussetzt, dass Deine Bitmap eine 32-Bit - Bitmap ist, nutzen, um die Transparenz zu ändern:

Delphi-Quellcode:

Type
  TRGB32 = packed record
    B, G, R, A: Byte;
  end;

  TRGB32Array = packed array[0..MaxInt div SizeOf(TRGB32)-1] of TRGB32;
  PRGB32Array = ^TRGB32Array;

procedure SetAlphaValue (bm: TBitmap; val: Byte);
var
  y, x, LineLen: Integer;
  FirstLine : PRGB32Array;
begin
  FirstLine := bm.ScanLine[0];
  LineLen := - bm.width;

  for y := 0 to bm.Height-1 do begin
    for x := 0 to bm.Width-1 do begin
      FirstLine[y*LineLen+x].A := val;
    end;
  end;
end;
"A" steht für Alpha-Value und ist der Wert, der die Transparenz eines Bildpunktes in der Bitmap beschreibt.

Du nimmst also Dein Original-Bitmap und weist dies einer Kopie zu. Die Kopie veränderst Du per Aufruf mit SetAlpha-Value, indem Du bei den jeweiligen Aufrufen bei der Variablen "Val" von 255 auf 0 runtergehst und zeigst dann die veränderte Kopie auf Deinem Canvas an. Zur Anzeige einer transparenten Bitmap auf Deinem Canvas musst Du eine Funktion nutzen, die transparente Bitmaps zeichnen kann, z.B. aus der Windows-API die "AlphaBlend".

Diese Lösung deckt eine Konstellation nicht ab, die aber nach Deiner Beschreibung auch nicht gefordert ist: Hat die Grafik bereits einzelne transparente Pixel, werden diese bei Aufruf von "SetAlphaValue" immer mit dem Wert von "Val" überschrieben, daher müsste man die Funktion anders gestalten, wollte man auch diese Konstellation erfassen. Das habe ich hier aber weggelassen, um die Sache nicht zu verkomplizieren.

Übrigens: Welche Delphi-Version nutzt Du und auf welchem Zielsystem soll Dein Programm eingesetzt werden? Solche Hintergründe sind relativ oft relevant für die korrekte Beantwortung solcher Fragen.

Geändert von Harry Stahl (20. Aug 2014 um 23:45 Uhr) Grund: Korrektur
  Mit Zitat antworten Zitat