Ach sach ma:
Wie misst du eigentlich die Zeit? Doch hoffentlich nicht mit Now()
Nochmal genauer gemessen:
Meine alte Variante brauchte ~ 5.8ms
Nen bisschen was umgestellt und jetzt läuft sie bei mir zwischen 3.9 - 4.1ms
(Vielleicht ist nen off by one error drin nicht genau geprüft *hust*)
Delphi-Quellcode:
type
TRGBA = packed record
B, G, R, A: Byte;
end;
PRGBA = ^TRGBA;
TRGBA4 = array[0..3] of TRGBA;
PRGBA4 = ^TRGBA4;
TScanLine = array[0..100000] of TRGBA;
PScanLine = ^TScanLine;
function HasTransparentRGBAValues(const bm:TBitmap): Boolean;
var
z: Integer;
RGBA: PScanLine;
LPixels, LLastPixels: PRGBA4;
LPixel: PRGBA;
i: Integer;
begin
RGBA := bm.Scanline[bm.Height-1];
z := bm.Width * bm.Height;
LPixels := @RGBA[0];
LLastPixels := @RGBA[z div 4 * 4];
while (LPixels <> LLastPixels) and ((LPixels[0].A and LPixels[1].A and LPixels[2].A and LPixels[3].A) = 255) do
Inc(LPixels);
Result := ((LPixels[0].A and LPixels[1].A and LPixels[2].A and LPixels[3].A) <> 255);
if not Result then
begin
Inc(LPixels);
LPixel := PRGBA(LPixels);
for i := 0 to z mod 4 - 1 do
begin
if LPixel.A < 255 then
Exit(True);
Inc(LPixel);
end;
end;
end;