画像の合成(セピアカラー加算)のサンプルコード
画像に「合成(セピアカラー加算)」の処理をするサンプルです。ソースコードはDelphi5で作成しましたがその他の言語でも流用できるかと思います。
画像処理の結果
合成をする元の2枚のイメージです。
画像の合成結果です。(2枚のイメージを1枚にする)
ソースコード
[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.
[合成(セピアカラー加算)の関数]
//----------------------------------------------------------------------------- //■関数 EffectBlend_OldLook_Adding //■用途 画像の合成(セピアカラー加算) //■引数 hBMP1,hBMP2 ...転送元のビットマップのハンドル //■戻り値 // 新しいビットマップのハンドル //※合成する画像は2枚とも同一サイズを使用する //----------------------------------------------------------------------------- function EffectBlend_OldLook_Adding(hBMP1,hBMP2:HBitmap):HBitmap; var SrcBitmap1,SrcBitmap2,DestBitmap : TBitmap; Row, Col : Integer; SrcRow1,SrcRow2,DestRow : pRGBArray; YIQ1,YIQ2,R1,G1,B1,R2,G2,B2:Integer; begin SrcBitmap1 := TBitmap.Create; SrcBitmap2 := TBitmap.Create; DestBitmap := TBitmap.Create; SrcBitmap1.Handle := hBMP1; SrcBitmap2.Handle := hBMP2; Set24bit(SrcBitmap1,DestBitmap); Set24bit(SrcBitmap1,SrcBitmap2); try for Row := 0 to SrcBitmap1.Height - 1 do begin SrcRow1 := SrcBitmap1.Scanline[Row]; SrcRow2 := SrcBitmap2.Scanline[Row]; DestRow := DestBitmap.Scanline[Row]; for Col := 0 to SrcBitmap1.Width - 1 do begin // NTSC系加重平均法を用いてグレースケール化 YIQ1 := Set255(Round(SrcRow1[Col].rgbtRed * 0.289+ SrcRow1[Col].rgbtGreen * 0.586+ SrcRow1[Col].rgbtBlue * 0.114 )); YIQ2 := Set255(Round(SrcRow2[Col].rgbtRed * 0.289+ SrcRow2[Col].rgbtGreen * 0.586+ SrcRow2[Col].rgbtBlue * 0.114 )); R1 := YIQ1 + 30 ; R2 := YIQ2 + 30 ; G1 := YIQ1 ; G2 := YIQ2 ; B1 := YIQ1 - 20 ; B2 := YIQ2 - 20 ; DestRow[Col].rgbtRed := Set255(R1+R2); DestRow[Col].rgbtGreen:= Set255(G1+G2); DestRow[Col].rgbtBlue := Set255(B1+B2); end; end; Result:=DestBitmap.ReleaseHandle; except Result:=SrcBitmap1.ReleaseHandle; end; SrcBitmap1.free; SrcBitmap2.free; DestBitmap.free; end;
[関数の呼び出し]
procedure TForm1.Button1Click(Sender: TObject); begin Image1.Picture.Bitmap.Handle := EffectBlend_OldLook_Adding(Image1.Picture.Bitmap.ReleaseHandle, Image2.Picture.Bitmap.ReleaseHandle ); end;
スポンサーリンク
関連記事
公開日:2015年02月24日
記事NO:00294