Kann jemand helfen ?
Mein Versuch..
Delphi-Quellcode:
function Rgb2Alpha(colrRGB: Colorref): Byte;
begin
if colrRGB <> 0
then
Result := LOBYTE(round(colrRGB * 0.2989)) + LOBYTE(round((colrRGB
shr 8) * 0.5870)) +
LOBYTE(round((colrRGB
shr 16) * 0.114))
else
Result := 0;
end;
procedure TSkinEngine.SetupAlphaChannel(
DC: HDC);
var
bm: BITMAP;
P: integer;
Alpha: byte;
pBits: PByte;
begin
FillChar(bm, sizeof(bm), 0);
GetObject(GetCurrentObject(
DC, OBJ_BITMAP), sizeof(bm), @bm);
pBits := bm.bmBits;
for P := 0
to (bm.bmWidth * bm.bmHeight) -1
do
begin
Alpha := (Rgb2Alpha(
RGB(pBits[2], pBits[1], pBits[0]))
and $000000FF);
if ((Alpha = 0)
and (pBits[3] = 0))
then
pBits[3] := 0
else
if (pBits[3] = 0)
then
pBits[3] := 255;
inc(pBits, 4);
end;
end;
Das Problem ist einmal funktioniert es dann wieder nicht!
Das erste schlecht das zweite gut.
gruss
Auch wenn Du schriebst, es sei erledigt:
Wenn ich das richtig verstehe, errechnest du mit "Rgb2Alpha" für jedes Pixel aus den
RGB-Werten einen "Grau-Wert. Wenn dieser = 0 (Schwarz) ist und pBits[3] = 0 ist, denn setzt du pBits[3] = 0 (Warum eigentlich= ist doch schon 0)
andernfalls, wenn der Grau-Wert <> 0 ist und pBits[3] = 0 ist dann setzt du pBits[3] = 255.
Problem dürfte sein, dass Deine "Rgb2Alpha" nicht korrekt arbeitet.
So sollte die korrekte Ergebnisse liefern:
Delphi-Quellcode:
function Rgb2Alpha(colrRGB: Colorref): Byte;
begin
if colrRGB <> 0 then
// Result := LOBYTE(round(colrRGB * 0.2989)) + LOBYTE(round((colrRGB shr 8) * 0.5870)) +
// LOBYTE(round((colrRGB shr 16) * 0.114))
Result := round(colrRGB and $FF * 0.2989) +
round(colrRGB shr 8 and $FF * 0.5870) +
round(colrRGB shr 16 * 0.114)
else
Result := 0;
end;