2006. július 7., péntek

Simple TBitmap blur algorithm

Problem/Question/Abstract:

How to blur a TBitmap

Answer:

The algorithm is very simple. The value of every pixel in the bitmap is replaced by the sum of the pixels information around the taken pixel divided by 8 (because there are 8 pixels around one pixel). To avoid problems we skip the pixels on the first and the last line and on the first and the last column.

function blur(source: TBitmap): TBitmap;
var
x, y: integer;
tline, mline, bline: PByteArray;
begin
for y := 1 to source.Height - 2 do
begin
tline := source.ScanLine[y - 1];
mline := source.ScanLine[y];
bline := source.ScanLine[y + 1];
for x := 1 to source.Width - 2 do
begin
mline^[x * 3] := (mline^[x * 3 - 3] + mline^[x * 3 + 3] +
tline^[x * 3 - 3] + tline^[x * 3 + 3] + tline^[x * 3] +
mline^[x * 3 - 3] + mline^[x * 3 + 3] + mline^[x * 3]) div 8;
mline^[x * 3 + 1] := (mline^[x * 3 - 2] + mline^[x * 3 + 4] +
tline^[x * 3 - 2] + tline^[x * 3 + 4] + tline^[x * 3 + 1] +
mline^[x * 3 - 2] + mline^[x * 3 + 4] + mline^[x * 3 + 1]) div 8;
mline^[x * 3 + 2] := (mline^[x * 3 - 1] + mline^[x * 3 + 5] +
tline^[x * 3 - 1] + tline^[x * 3 + 5] + tline^[x * 3 + 2] +
mline^[x * 3 - 1] + mline^[x * 3 + 5] + mline^[x * 3 + 2]) div 8;
end;
end;
result := source;
end;

Usage example:

image1.picture.bitmap := blur(image1.picture.bitmap);

where image1 is a TPicture object.


Nincsenek megjegyzések:

Megjegyzés küldése