Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi AlphaBlend Png Hintergrund ist weiß (https://www.delphipraxis.net/192249-alphablend-png-hintergrund-ist-weiss.html)

EWeiss 3. Apr 2017 11:00

AlphaBlend Png Hintergrund ist weiß
 
Meine Funktion

Delphi-Quellcode:
procedure TSkinEngine.DrawAlphaBlend(DC: HDC; X, Y, ClientWidth, ClientHeight: Integer;
  fBlend: Byte);
var
  hTempDC: HDC;
  bf: BLENDFUNCTION;
  hBmp: HBITMAP;
  bmi: BITMAPINFO;
  pvBits: Pointer;
begin
  hTempDC := CreateCompatibleDC(DC);

  ZeroMemory(@bmi, sizeof(BITMAPINFO));
  bmi.bmiHeader.biSize := sizeof(BITMAPINFOHEADER);
  bmi.bmiHeader.biWidth := ClientWidth;
  bmi.bmiHeader.biHeight := ClientHeight;
  bmi.bmiHeader.biPlanes := 1;
  bmi.bmiHeader.biBitCount := 32;
  bmi.bmiHeader.biCompression := BI_RGB;
  bmi.bmiHeader.biSizeImage := ClientWidth * ClientHeight * 4;

  hBmp := CreateDIBSection(hTempDC, bmi, DIB_RGB_COLORS, pvBits, 0, 0);
  SelectObject(hTempDC, hBmp);

  bf.BlendOp := AC_SRC_OVER;
  bf.BlendFlags := 0;
  bf.SourceConstantAlpha := fBlend;
  bf.AlphaFormat := 0;

  AlphaBlend(DC, X, Y, ClientWidth, ClientHeight, hTempDC, 0, 0, ClientWidth, ClientHeight, bf);

  DeleteObject(hBmp);
  DeleteDC(hTempDC);
end;
Das Problem ist nun das der Hintergrund der PNG der eigentlich Transparent ist mit AlphaBlend weiß gezeichnet wird.
Wie bekomme ich den Kram weg damit es wieder transparent ist.

gruss

TiGü 3. Apr 2017 12:44

AW: AlphaBlend Png Hintergrund ist weiß
 
Delphi-Quellcode:
procedure TSkinEngine.DrawAlphaBlend(DC: HDC; X, Y, ClientWidth, ClientHeight: Integer; fBlend: Byte);
var
  hTempDC: HDC;
  bf: BLENDFUNCTION;
  hBmp: HBITMAP;
  bmi: BITMAPINFO;
  pvBits: Pointer;
begin
  hTempDC := CreateCompatibleDC(DC);
  if hTempDC <> 0 then
  begin
    try
      ZeroMemory(@bmi, sizeof(BITMAPINFO));
      bmi.bmiHeader.biSize := sizeof(BITMAPINFOHEADER);
      bmi.bmiHeader.biWidth := ClientWidth;
      bmi.bmiHeader.biHeight := ClientHeight;
      bmi.bmiHeader.biPlanes := 1;
      bmi.bmiHeader.biBitCount := 32;
      bmi.bmiHeader.biCompression := BI_RGB;
      bmi.bmiHeader.biSizeImage := ClientWidth * ClientHeight * 4;

      hBmp := CreateDIBSection(hTempDC, bmi, DIB_RGB_COLORS, pvBits, 0, 0);
      if hBmp <> 0 then
      begin
        try
          SelectObject(hTempDC, hBmp);

          bf.BlendOp := AC_SRC_OVER;
          bf.BlendFlags := 0;
          bf.SourceConstantAlpha := fBlend;
          // 0 bedeutet ja AC_SRC_OVER, mal die anderen Werte probieren?
          // https://msdn.microsoft.com/de-de/library/windows/desktop/dd183393(v=vs.85).aspx
          bf.AlphaFormat := AC_SRC_ALPHA;

          // Gibt es möglicherweise einen Fehler?
          if not AlphaBlend(DC, X, Y, ClientWidth, ClientHeight, hTempDC, 0, 0, ClientWidth, ClientHeight, bf) then
          begin
            // Im Fehlerfall den Windows-Fehler als Exception zur Anzeige bringen.
            RaiseLastOSError;
          end;
        finally
          DeleteObject(hBmp);
        end;
      end;
    finally
      DeleteDC(hTempDC);
    end;
  end;
end;

EWeiss 3. Apr 2017 18:54

AW: AlphaBlend Png Hintergrund ist weiß
 
Zitat:

0 bedeutet ja AC_SRC_OVER, mal die anderen Werte probieren?
Ja nur wenn ich den Alpha Wert nicht ignoriere blendet gar nichts mehr.

Das AC_SRC_ALPHA verhindert in dem Fall das Blenden
Nein Fehler gibt es keinen.

gruss

EWeiss 3. Apr 2017 19:33

AW: AlphaBlend Png Hintergrund ist weiß
 
hbrBackground = 0
Kein WS_EX Style WS_EX_LAYERED verträgt sich nicht mit Child Fenster
Bitmap Png Gdiplus Image

EDIT:
Hat sich erledigt.

grusss


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:38 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-2025 by Thomas Breitkreuz