TOP > カテゴリ > 画像処理工学 >

RGBカラー交換のサンプルコード

画像に「RGBカラー交換」の処理をするサンプルです。ソースコードはDelphi5で作成しましたがその他の言語でも流用できるかと思います。

画像処理の結果

RGBカラー交換をすると下図のようになります。(RGB→RBG)

ソースコード

[EffectBass.pas - 汎用モジュール]

//Bass Unit
unit EffectBass;

interface
uses
 Windows,SysUtils, Classes, Graphics;

type
 //24bitアクセス用ポインタ
 pRGBarray  = ^TRGBarray;
 TRGBarray  = array[0..0] of TRGBTriple; //None リテラル

type
 //24bitアクセス用ダブルポインタ
 PPBits = ^TPBits;
 TPBits = array[0..0] of pRGBarray; //None リテラル

//汎用プロシージャ
procedure Set24bit(Src,Dest :TBitmap);
function  Set255(Value : integer) : BYTE;

implementation


/////////
procedure Set24bit(Src,Dest :Tbitmap);
begin
  Src.PixelFormat :=pf24bit;
  Dest.PixelFormat:=pf24bit;
  Dest.Width:=Src.Width;
  Dest.Height:=Src.Height;
end;

/////////
function Set255(Value:Integer):Byte;
begin
 if Value>=255 then
  Result:=255
 else if Value<=0 then
 Result:=0
 else Result:=Value;
end;
end.

[RGBカラー交換の関数]

//-----------------------------------------------------------------------------
//■関数     EffectRGBColor_Exchange
//■用途     RGBカラー交換
//■引数     hBMP   ... 転送元のビットマップのハンドル
//           Value  ...
//             1 :  Red  <-> Green のみ変換
//             2 :  Red  <-> Blue  のみ変換
//             3 :  Blue <-> Green のみ変換
//             4 :  R->G B->R G->B
//             5 :  R->B B->G G->R
//■戻り値
//           新しいビットマップのハンドル
//-----------------------------------------------------------------------------
function EffectRGBColor_Exchange(hBMP:HBitmap;Value:integer):HBitmap;
var 
  Row,Col        : Integer;
  SrcRow,DestRow : pRGBArray;
  SrcBitmap,DestBitmap:TBitmap    ;
begin
  SrcBitmap := TBitmap.Create;
  DestBitmap := TBitmap.Create;
  SrcBitmap.handle := hBMP;
  Set24bit(SrcBitmap,DestBitmap);

  try
    for Row:=0 to DestBitmap.Height-1 do
    begin
        SrcRow  := SrcBitmap.ScanLine[Row];
        DestRow := DestBitmap.ScanLine[Row];

        for Col:=0 to DestBitmap.Width-1 do
        begin
          WITH DestRow[Col] do
            CASE Value of
              1:begin
                  rgbtBlue  := SrcRow[Col].rgbtBlue;
                  rgbtGreen := SrcRow[Col].rgbtRed;
                  rgbtRed   := SrcRow[Col].rgbtGreen;
                end;
              2:begin
                  rgbtBlue  := SrcRow[Col].rgbtRed;
                  rgbtGreen := SrcRow[Col].rgbtGreen;
                  rgbtRed   := SrcRow[Col].rgbtBlue;
                end;
              3:begin
                  rgbtBlue  := SrcRow[Col].rgbtGreen;
                  rgbtGreen := SrcRow[Col].rgbtBlue;
                  rgbtRed   := SrcRow[Col].rgbtRed;
                end;
              4:begin
                  rgbtBlue  := SrcRow[Col].rgbtRed;
                  rgbtGreen := SrcRow[Col].rgbtBlue;
                  rgbtRed   := SrcRow[Col].rgbtGreen;
                end;
              5:begin
                  rgbtBlue  := SrcRow[Col].rgbtGreen;
                  rgbtGreen := SrcRow[Col].rgbtred;
                  rgbtRed   := SrcRow[Col].rgbtBlue;
               end;
          end;
        end;
   end;

   Result := DestBitmap.ReleaseHandle;
  except
    Result := SrcBitmap.ReleaseHandle;
  end;

  SrcBitmap.free;
  DestBitmap.free;
end;

[関数の呼び出し]

procedure TForm1.Button1Click(Sender: TObject);
begin
    Image1.Picture.Bitmap.Handle :=
      EffectRGBColor_Exchange(Image1.Picture.Bitmap.ReleaseHandle,3);
end;





関連記事



公開日:2015年02月24日
記事NO:00297