色調の反転
RGBそれぞれの値を反転します。
インラインアセンブラで挑戦
反転の計算は説明するまでもないと思いますので、インラインアセンブラで書いてみました。
32ビットずつ計算して一括だぁ、、、と思ったらαチャンネルまで反転してしまった。
(そもそも画像を32ビットで処理してるのが間違い)
{色調の反転}
procedure ImageInvert(bmp: TBitmap);
var
i,Count :integer;
P :PByteArray;
begin
for i := 0 to bmp.Height - 1 do
begin
p:= bmp.ScanLine[i];
Count:= (bmp.Width-1);
asm
mov edx,p; //配列のアドレス
mov ecx,Count; //カウンタ(ピクセル数)
@Loop_Head:
mov ax,[edx]; //B,G,2バイト分処理
not ax; //反転
mov [edx],ax;
inc edx;
inc edx;
mov ah,[edx]; //R 1バイト処理
not ah;
mov [edx],ah;
inc edx;
loop @Loop_Head; //ECX=0 までループ
end;
end;
end;
う~ん、なぜこのWikiは段落が揃わないのだろう?
最終更新:2007年04月20日 10:13