Zitat von
Muetze1:
Du beachtest nicht das padding zwischen den einzelnen ScanLines! Jede ScanLine ist 32 Bit aligned und da du mit 24 bpp arbeitest ist nur jeder 4. Pixel 32 bit aligned und somit hast du eine große Chance auf falsche Pixeldaten zu zu greifen.
Hierbei wird dies aber nicht auffallen, da mit jedem Byte das gleich gemacht wird. Aus diesem Grund könntest du auch gleich mit einem PByte arbeiten.
Oh stimmt, da ich sonst immer mit 32bit arbeite hab ich jetzt im moment garnicht daran gedacht...
Hier die korrigierte Version:
Delphi-Quellcode:
procedure Multi(src: TBitmap; r, g, b, Intensiv: Byte);
var
P: PRGBTriple;
x, y: integer;
begin
if src.PixelFormat<>pf24bit then
src.PixelFormat:=pf24bit;
for y:=0 to src.Height-1 do begin
P:=src.scanline[y];
for x:=0 to src.Width-1 do begin
P.rgbtBlue := (P.rgbtBlue shl 8 * not Intensiv + P.rgbtBlue * Succ(b) * Intensiv) shr 16;
P.rgbtGreen := (P.rgbtGreen shl 8 * not Intensiv + P.rgbtGreen * Succ(g) * Intensiv) shr 16;
P.rgbtRed := (P.rgbtRed shl 8 * not Intensiv + P.rgbtRed * Succ(r) * Intensiv) shr 16;
Inc(P);
end;
end;
end;