How to change brightness and contrast in large bitmaps (2) (Views: 30)
Problem/Question/Abstract: I have a Truecolor bitmap in TBitmap. Is there any fast coding to set the brightness? Answer: Add a fixed value and clip it to the range. I have used a LUT, which is faster for larger bitmaps. The range of Brightness is -255 (-100%) to 255 (+100%). You can use a 32 or 24 Bit calculation depending on the compiler setting ChangeBrightness24Bit. procedure ChangeBrightness(Bitmap: TBitmap; Brightness: Integer); var LUT: array[Byte] of Byte; v, i: Integer; {$IFDEF ChangeBrightness24Bit} w, h, x, y: Integer; LineSize: LongInt; pLineStart: PByte; {$ENDIF} p: PByte; begin { create LUT } for i := 0 to 255 do begin v := i + Brightness; if v < 0 then v := 0 else if v > 255 then v := 255; LUT[i] := v; end; {$IFDEF ChangeBrightness24Bit} { edit bitmap } w := Bitmap.Width; h := Bitmap.Height - 1; Bitmap.PixelFormat := pf24Bit; pLineStart := PByte(Bitmap.ScanLine[h]); { pixel line is aligned to 32 Bit } LineSize := ((w * 3 + 3) div 4) * 4; w := w * 3 - 1; for y := 0 to h do begin p := pLineStart; for x := 0 to w do begin p^ := LUT[p^]; Inc(p); end; Inc(pLineStart, LineSize); end; {$ELSE} { edit bitmap } Bitmap.PixelFormat := pf32Bit; p := PByte(Bitmap.ScanLine[Bitmap.Height - 1]); for i := 0 to Bitmap.Width * Bitmap.Height - 1 do begin p^ := LUT[p^]; Inc(p); p^ := LUT[p^]; Inc(p); p^ := LUT[p^]; Inc(p, 2); end; {$ENDIF} end; |