色調の反転




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