twitter ■お問い合わせ当サイトへのリンクサイト仕様

現在位置 > LostTechnology > Software > AutoClip

AutoClip

自動で画像をクリッピング

コマンドラインのジャンクツールです。ゲームなどの画面をAtroposなどでクライアント領域を取り込んだときに、画像の上下左右に枠が付いている場合があります。これを自動で取り除いてみようというのがこのツールです。画像の端から横もしくは縦に9割以上同一の色かをチェックし、該当するようであれば枠だと判定してクリッピングを行ないます。

処理したい画像を本ツールのアイコンにドロップして使ってください。コンソールからの使用は考慮していないため、ワイルドカード処理は実装していません。なお、対応している画像形式は、BMPとPNGの2種類だけです。

ソースコード

AutoClipはDelphi7で開発しました。たいしたことをしていませんが、参考にしたい方はご覧になってください。

program AutoClip;
(* Copyright (C) S.Kawaida *)
{$APPTYPE CONSOLE}
uses
	SysUtils, pngimage, Graphics, Math, Types;
const
	ExtList		= '.BMP.PNG';
var
	lp,slp		: Integer;
	bmp,clip		: TBitmap;
	png			: TPNGObject;
	rl,rt,rb,rr		: Integer;
	FileType		: Integer;
	SrcR,DstR		: TRect;
function CheckLineH(y:Integer):boolean;
var
	lp,pixel,rep	: Integer;
	MinMatch		: Integer;
begin
	MinMatch:=Floor(Int(bmp.Width*0.9));
	lp:=0;
	rep:=1;
	for lp:=0 to bmp.Width-2 do
	begin
		pixel:=bmp.Canvas.Pixels[lp,y];
		if (rep>=MinMatch) then Break;
		if (pixel<>bmp.Canvas.Pixels[lp+1,y]) then
		begin
			rep:=1;
		end
		else
		begin
			Inc(rep);
		end;
	end;
	Result:=(rep<MinMatch);
end;

function CheckLineV(x:Integer):boolean;
var
	lp,pixel,rep	: Integer;
	MinMatch	: Integer;
begin
	MinMatch:=Floor(Int(bmp.Height*0.9));
	lp:=0;
	rep:=1;
	for lp:=0 to bmp.Height-2 do
	begin
		pixel:=bmp.Canvas.Pixels[x,lp];
		if (rep>=MinMatch) then Break;
		if (pixel<>bmp.Canvas.Pixels[x,lp+1]) then
		begin
			rep:=1;
		end
		else
		begin
			Inc(rep);
		end;
	end;
	Result:=(rep<MinMatch);
end;

begin
	for lp:=1 to ParamCount do
	if FileExists(ParamStr(lp)) then
	begin
		bmp:=TBitmap.Create;
		clip:=TBitmap.Create;
		png:=TPNGObject.Create;
		try
			png.CompressionLevel:=9;
			FileType:=AnsiPos(AnsiUpperCase(ExtractFileExt(ParamStr(lp))),ExtList);
			case FileType of
				1:{BMP}
				begin
					bmp.LoadFromFile(ParamStr(lp));
				end;
				5:{PNG}
				begin
					png.LoadFromFile(ParamStr(lp));
					bmp.Assign(png);
				end;
			end;
			if (FileType>0) then
			begin
				rl:=0;
				rt:=0;
				rb:=bmp.Height-1;
				rr:=bmp.Width-1;
				for slp:=0 to bmp.Height-1 do
				begin
					rt:=slp;
					if CheckLineH(slp) then Break;
				end;
				for slp:=bmp.Height-1 downto 0 do
				begin
					rb:=slp;
					if CheckLineH(slp) then Break;
				end;
				for slp:=0 to bmp.Width-1 do
				begin
					rl:=slp;
					if CheckLineV(slp) then Break;
				end;
				for slp:=bmp.Width-1 downto 0 do
				begin
					rr:=slp;
					if CheckLineV(slp) then Break;
				end;
			end;{of if ImageLoad}
			if ((rl>0) or (rt>0) or (rr<bmp.Width-1) or (rb&lt;bmp.Height-1)) then
			begin
				clip.PixelFormat:=bmp.PixelFormat;
				clip.Width:=(rr-rl+1);
				clip.Height:=(rb-rt+1);
				DstR.Left:=0;
				DstR.Top:=0;
				DstR.Right:=clip.Width;
				DstR.Bottom:=clip.Height;
				SrcR.Left:=rl;
				SrcR.Top:=rt;
				SrcR.Right:=rr+1;
				SrcR.Bottom:=rb+1;
				clip.Canvas.CopyRect(DstR,bmp.Canvas,SrcR);
				bmp.Assign(clip);
				case FileType of
					1:{BMP}
					begin
						bmp.SaveToFile(ParamStr(lp));
					end;
					5:{PNG}
					begin
						png.Assign(bmp);
						png.SaveToFile(ParamStr(lp));
					end;
				end;
			end;
		finally
			bmp.Free;
			clip.Free;
			png.Free;
		end;{of try}
	end;{of if FileExists}
end.

動作環境・仕様とダウンロード

ソフトウェア仕様

対応OSWindows95/98/Me/2000/XP/Vista/7

最終更新2008-5-7

Version1.0.0.0

DownloadDOWNLOAD (size:101KB)

種別Freesoftware

履歴

2008-5-7 version 1.0.0.0
楽をするために開発。