DELPHI下的如何实现图像抖动处理?
unit 24bitto256;
{$A-}
interface
uses
Sysutils, Classes, Dialogs, Graphics;
procedure DitherImage(FullBMP : TBitmap);
implementation
var
CurrBMP : TBitmap;
CurrPxlPos : Integer;
CmpRVal,
CmpGVal,
CmpBVal : Byte;
RunRErr,
RunGErr,
RunBErr : SmallInt;
function DitherPixel(ABmp。 Canvas。Pixels(...全部
unit 24bitto256;
{$A-}
interface
uses
Sysutils, Classes, Dialogs, Graphics;
procedure DitherImage(FullBMP : TBitmap);
implementation
var
CurrBMP : TBitmap;
CurrPxlPos : Integer;
CmpRVal,
CmpGVal,
CmpBVal : Byte;
RunRErr,
RunGErr,
RunBErr : SmallInt;
function DitherPixel(ABmp。
Canvas。Pixels(Row, Col) : TColor) : TColor;
var
I, J, K : Integer;
RedVal,
GreenVal,
BlueVal : Byte;
CurrRErr,
CurrGErr,
CurrBErr : SmallInt;
MyClr : TColor;
begin
CurrRErr := 0;
CurrGErr := 0;
CurrBErr := 0;
RedVal := ABmp。
Canvas。Pixels(Row,Col)。Red;
GreenVal := ABmp。Canvas。Pixels(Row,Col)。Green;
BlueVal := ABmp。
Canvas。Pixels(Row,Col)。Blue;
CmpRVal := ABmp。Canvas。Pixels(Row, Col + 1)。Red;
CmpGVal := ABmp。
Canvas。Pixels(Row, Col + 1)。Green;
CmpBVal := ABmp。Canvas。Pixels(Row, Col + 1)。Blue;
CurrRErr := CurrRErr + (RedVal - CmpRVal) div 16;
CurrGErr := CurrGErr + (GreenVal - CmpGVal) div 16;
CurrBErr := CurrBErr + (BlueVal - CmpBVal) div 16;
CmpRVal := ABmp。
Canvas。Pixels(Row + 1, Col - 1)。Red;
CmpGVal := ABmp。Canvas。Pixels(Row + 1, Col - 1)。Green;
CmpBVal := ABmp。
Canvas。Pixels(Row+ 1, Col - 1)。Blue;
CurrRErr := CurrRErr + ((RedVal - CmpRVal) div 16) * 7;
CurrGErr := CurrGErr + ((GreenVal - CmpGVal) div 16) * 7;
CurrBErr := CurrBErr + ((BlueVal = CmpBVal)) div 16) * 7;
CmpRVal := ABmp。
Canvas。Pixels(Row + 1, Col)。Red;
CmpGVal := ABmp。Canvas。Pixels(Row + 1, Col)。Green;
CmpBVal := ABmp。
Canvas。Pixels(Row + 1, Col)。Blue;
CurrRErr := CurrRErr + ((RedVal - CmpRVal) div 16) * 5;
CurrGErr := CurrGErr + ((GreenVal - CmpGVal) div 16) * 5;
CurrBErr := CurrBErr + ((BlueVal - cmpBVal) div 16) * 5;
CmpRVal := ABmp。
Canvas。Pixels(Row + 1, Col + 1)。Red;
CmpGVal := ABmp。Canvas。Pixels(Row + 1, Col + 1)。Green;
CmpBVal := ABmp。
Canvas。Pixels(Row + 1, Col + 1)。Blue;
CurrRErr := CurrRErr + ((RedVal - CmpRVal) div 16) * 3;
CurrGErr := CurrGErr + ((GreenVal - CmpGVal) div 16) * 3;
CurrBErr := CurrBErr + ((BlueVal - CmpBVal) div 16) * 3;
RunRErr := RunRErr + CurrRErr;
RunGErr := RunGErr + CurrGErr;
RunBErr := RunBErr + CurrBErr;
MyClr。
Red := RedVal + RunRErr;
MyClr。Green := GreenVal + RunGErr;
MYClr。Blue := BlueVal + RunBErr;
DitherPixel := MyClr;
end;
procedure DitherLine(TheBMP : TBitmap; LineCntr : Integer);
begin
For J := 0 to TheBMP。
Width - 1 do
begin
TheBMP。Canvas。Pixels(LineCntr, J) := DitherPxl(TheBMP。Canvas。Pixels(LineCntr, J));
end;
end;
procedure DitherImage(FullBMP : TBitmap);
var
I : Integer;
begin
CurrBMP := TBitmap。
Create;
CurrBMP。Assign(FullBMP);
RunErr := 0;
for I := 0 to FullBMP。Height - 1 do
begin
DitherLine(CurrBMP, I);
end;
FullBMP。
Assign(CurrBMP);
CurrBMP。Free;
end;
end。
。收起