========================================================================== 画像補正用コンポーネント TTurboImage Image Correct Component Version 0.7 Copyright(C) 2008, 2009 seizo ========================================================================== 【 概要 】 画像の明るさ・コントラスト・ガンマ値等、見栄えのする画像を作る際 に必要となる画像補正処理を高速で行なうためのコンポーネントです。 TTurboImage は、TImage を継承していますので、TImage に画像補正機能 を追加したものという感覚で使用できます。実際の処理は、ScanLine を キャッシュしておこないますので、大変高速な画像補正処理が可能です。 このバージョンの TTurboImage で行なえる画像の補正処理は、以下の 通りです。 ・明るさの調整(比率による明るさの調整) ・コントラストの調整 ・ガンマ値の補正 ・エッジ強調 ・ノイズ除去 ・輪郭描画 ・輪郭抽出 ・回転処理(90°単位) ・反転処理 ・ぼかし ・ポスタリゼーション処理 ・モザイク化 ・グレイスケール化 ・セピア調化 ・ネガティブ処理 ・額縁効果 ・明るさの調整(階調値の増減による明るさの調整) ・階調値の分布指定(画像の明るさの分布を指定範囲内に収めます。) ・スムーズできれいな拡大 ・スムーズできれいな縮小 ・スムーズできれいな拡大・縮小 ・減色(256 色 8 ビットへの減色 --- 6 種類の方法を選べます。) ・トリミング このほか、表示中の画像のヒストグラムを別の指定された、ビットマップ あるいは、メタファイルのキャンバスに描画する機能も備えています。 【 プロパティ 】 このコンポーネント TTurboImage で追加されたプロパティは、以下の通りです。 property PictureType: TPictureType; 現在、Picture.Graphic が保持するグラフィックの種類を示します。 TPictureType は、次の様に定義されています。 type TPictureType = (picNil, picBitmap, picMetafile, picIcon, picUnknown); picNil ・・・ 何もグラフィックのない状態 picBitmap ・・・ ビットマップが格納された状態 picMetafile ・・・ メタファイルが格納された状態 picIcon ・・・ アイコンが格納された状態 picUnknown ・・・ 上記以外のグラフィックが格納された状態 【 メソッド 】 このコンポーネント TTurboImage で追加されたメソッドは、以下の通りです。 procedure Blur; ビットマップ画像のぼかしを行ないます。 Picture.Graphic is TBitmap でない場合および、256 色 8 ビット以下の カラーの場合は、何もしません。 procedure Bright(Param: Integer); ビットマップ画像の明るさを調整します。 Picture.Graphic is TBitmap でない場合および、256 色 8 ビット以下の カラーの場合は、何もしません。もとの画像に対する明るさの比率 Param は、Param >= 0 の範囲で指定して下さい。 procedure Contrast(Param: Integer; Border: Integer); ビットマップ画像のコントラストを調整します。 Picture.Graphic is TBitmap でない場合および、256 色 8 ビット以下の カラーの場合は、何もしません。もとの画像に対するコントラストの比率 Param は、Param >= 0 の値で指定して下さい。Border を境により明るくする部分と より暗くする部分を分けます。Border は、0 〜 255 の範囲で指定して下さい。 通常は、Border の値は、0 〜 255 の中間点 127 で良いと思います。 procedure Distribution(ParamMin: Integer; ParamMax: Integer); ビットマップ画像の明るさの分布を指定範囲内に収めます。 Picture.Graphic is TBitmap でない場合および、256 色 8 ビット以下の カラーの場合は、何もしません。範囲の最小値 ParamMin は、-255 〜 255 の範囲で、最大値 ParamMax は、0 〜 510 の範囲で指定して下さい。 また、ParamMin <= ParamMax でなければなりません。 通常は、ParamMin := 0; ParamMax := 255; 位で良いと思います。 procedure Edge(Param: Integer); ビットマップ画像のエッジを強調します。 Picture.Graphic is TBitmap でない場合および、256 色 8 ビット以下の カラーの場合は、何もしません。エッジを強調する度合い Param は、 1 〜 100 の範囲で指定して下さい。 procedure Enlarge(ParamWidth: Integer; ParamHeight: Integer); ビットマップ画像を Bi-Linear法で拡大します。 Picture.Graphic is TBitmap でない場合は、何もしません。 ParamWidth, ParamHeight は、拡大後の新しい大きさです。 procedure Framing(ParamWidth: Integer; ParamContrast: Integer; ParamShape: Boolean); ビットマップ画像の縁を額縁調に変換します。 Picture.Graphic is TBitmap でない場合および、256 色 8 ビット以下の カラーの場合は、何もしません。額縁調にする幅 ParamWidth は、1 〜 で、 額縁調にする部分のコントラスト値 ParamContrast は、105 〜 300 の範囲 で指定して下さい。左右からの光の方向を決めるフラグ ParamShape は、True で左からの光を、False で右からの光を指定します。 procedure Gamma(Param: Extended); ビットマップ画像のガンマ補正をします。 Picture.Graphic is TBitmap でない場合および、256 色 8 ビット以下の カラーの場合は、何もしません。ガンマ値 Param は、0.10 〜 10.00 の 範囲で指定して下さい。 procedure GrayScale; ビットマップ画像をグースケール(モノクロ調)に変換します。 Picture.Graphic is TBitmap でない場合および、256 色 8 ビット以下の カラーの場合は、何もしません。 procedure Histgram(var ToDraw: TGraphic; Size: Integer; Step: Integer; H: Integer); 現在表示されている画像のヒストグラムを指定された ToDraw :TGraphic に描画する手続きです。 現在表示中の画像がどの様な種類であっても ヒストグラムを描画しますが、表示先の ToDraw :TGraphic は、 ビットマップかメタファイルでなければなりません。表示サイズ Size は、 1 〜 5 の範囲で指定して下さい。またヒストグラムを描画する際の階調間 のステップ値を決定する引数 Step は、0 〜 3 の範囲で指定して下さい。 実際のステップ値は、2 の Step 乗となります。引数 Step の値が小さいほど より正確でなめらかなヒストグラムグラフが得られますが、多少表示に時間が かかる様になります。また引数 H はグラフ上のたて軸の最大値を指定する値で、 現在表示されている画像の全ピクセル数に対する割合(%値)をあらわします。 H は、0 〜 100 の範囲で指定して下さい。ただし H = 0 の場合は、この 手続き内で最適な H の値を計算してその値に設定します。H > 0 の場合は、 その値に固定されます。この場合、10 〜 50 位の値が良いと思います。 procedure Light(Param: Integer); ビットマップ画像の明るさを調整します。 Picture.Graphic is TBitmap でない場合および、256 色 8 ビット以下の カラーの場合は、何もしません。もとの画像に対する明るさの増減値 Param は、-255 〜 255 の範囲で指定して下さい。Bright() との違いは、Param の値を乗算ではなく加算することにより明るさを調整するという点にあります。 これにより完全に黒い部分でも明るくする事が可能です。用途により Bright() と Light() を使い分けて下さい。 procedure Median(Param: Integer); メディアンフィルタによって、ビットマップ画像のノイズを除去します。 Picture.Graphic is TBitmap でない場合および、256 色 8 ビット以下の カラーの場合は、何もしません。ノイズ除去の度合い Param は、0 〜 100 の範囲で指定して下さい。 procedure Mosaic(Param: Integer); ビットマップ画像をモザイク調に変換します。 Picture.Graphic is TBitmap でない場合および、256 色 8 ビット以下の カラーの場合は、何もしません。個々のモザイクの大きさ Param は、 2 〜 50 の範囲で指定して下さい。 procedure Negative; ビットマップ画像の色を反転します。(ネガティブ反転) Picture.Graphic is TBitmap でない場合および、256 色 8 ビット以下の カラーの場合は、何もしません。 procedure Posterization(Param: Integer); ビットマップ画像にポスタリゼーション(階調変更)処理を施します。 Picture.Graphic is TBitmap でない場合および、256 色 8 ビット以下の カラーの場合は、何もしません。階調数 Param は、2 〜 128 の範囲で指定 して下さい。ポスタリゼーションとは、画像の階調数を変更する為の処理です。 通常の24 ビットカラー画像は、青・緑・赤 各々 256 階調で表現されていますが、 この階調数を変更することで様々な効果を出すことが出来、また他の処理 の前処理として使われることもあります。 procedure Reduce(Param: TReduceType); ビットマップ画像を 6 種類の方法で 256 色に減色します。 Picture.Graphic is TBitmap でない場合および、256 色 8 ビット以下の カラーの場合は、何もしません。Param には、減色の方法 TReduceType を指定して下さい。TReduceType は、以下の様に定義されています。 TReduceType = (rdcOctree, // Octree で減色 rdcMedianCut, // MedianCut で減色 rdcMedianCutV, // MedianCut + 分散で減色 rdcMedianCutE, // MedianCut + 誤差拡散で減色 rdcMedianCutVE, // MedianCut + 分散 + 誤差拡散で減色 rdcStaticE); // 固定パレット + 誤差拡散で減色 procedure Reverse; ビットマップ画像を反転表示します。 Picture.Graphic is TBitmap でない場合は、何もしません。 procedure Sepia; ビットマップ画像をセピア調に変換します。 Picture.Graphic is TBitmap でない場合および、256 色 8 ビット以下の カラーの場合は、何もしません。 procedure Shrink(ParamWidth: Integer; ParamHeight: Integer); ビットマップ画像を積分法で縮小します。 Picture.Graphic is TBitmap でない場合は、何もしません。 ParamWidth, ParamHeight は、で縮小後の新しい大きさです。 procedure Sobel(Param: Integer; Draw: Boolean); ビットマップ画像の輪郭抽出あるいは、輪郭描画を行ないます。 Picture.Graphic is TBitmap でない場合および、256 色 8 ビット以下の カラーの場合は、何もしません。輪郭の強さの度合い Param は、1 〜 100 の範囲で指定して下さい。Draw = True なら輪郭描画を False なら輪郭抽出 を行ないます。 procedure Stretches(ParamWidth: Integer; ParamHeight: Integer); ビットマップ画像を Bi-Linear & 積分法で拡大縮小します。 Picture.Graphic is TBitmap でない場合は、何もしません。 ParamWidth, ParamHeight は、でサイズ変更後の新しい大きさです。 procedure Trimming(ParamR: TRect; ParamG: Boolean); 画像をトリミングします。Picture.Graphic is TBitmap か TMetafile の場合のみ トリミングを行ないます。トリミングする範囲 ParamR が画像の範囲を超えている 場合は、何も行ないません。ParamG は、ParamR がどの範囲を基準にするかを指定 する引数で ParamG = True の場合は、Picture.Graphic 上の範囲を基準にし、また ParamG = False の場合は、コントロール上の範囲を基準にします。通常は、ParamG は、False で良いと思います。Stretch = True 場合は、その時の画像の縦・横 それぞれの拡大・縮小率にあわせてトリミング後も縦・横がトリミング前と同じ 比率になる様にコントロールのサイズを調整します。 procedure Turn(Param: Integer); ビットマップ画像を 90 度単位で回転表示します。 Picture.Graphic is TBitmap でない場合は、何もしません。 【 イベント 】 このコンポーネント TTurboImage で追加されたイベントは、以下の通りです。 property OnAmend: TNotifyAmendEvent; 表示中の画像に何らかの補正を施す直前に発生するイベント property OnAmended: TNotifyAmendEvent; 表示中の画像に何らかの補正を施した直後に発生するイベント ※TNotifyAmendEvent は、以下の様に定義されています。引数 Kind には、 補正の種類を示す文字列(メソッド名)が格納されています。 引数 Kind の値を調べる事により現在の補正の種類を知る事が出来ます。 type TNotifyAmendEvent = procedure(Sender: TObject; Kind: String) of object; 【 テクニカル情報 】 ◎TTurboImage のほとんどの画像補正処理メソッドは、Picture.Graphic is TBitmap でない場合は、何もしません。ビットマップ以外の画像を表示している場合には、 可能な場合は、Picture.Graphic に格納されているデータをビットマップに変換 してから各メソッドを呼んで下さい。 例えば、JPEG 画像を表示中であれば、以下の様にして下さい。 procedure TForm1.BrightImage(Param: Integer); var Bmp: TBitmap; begin if not (Paran in [0..200]) then // 明るさは、0 % 〜 200 % の範囲で Exit; if TurboImage1.Picture.Graphic is TJPEGImage then // JPEG 画像の場合 begin Bmp := TBitmap.Create; try Bmp.Assign(TurboImage1.Picture.Graphic); TurboImage1.Picture.Graphic := Bmp; // ビットマップに変換する。 finally Bmp.Free; end; end else if not (TurboImage1.Picture.Graphic is TBitmap) then Exit; TurboImage1.Bright(Param); // 明るさをもとの Param % にする。 end; ◎TTurboImage は、Turn() メソッド以外では、256 色 8 ビット以下の カラーの場合は、何もしません。この様な時どうしても必要な場合には、 一時的に色数を変更して処理を行なって下さい。 例えば、4 ビット 16 色カラーであれば、以下の様にして下さい。 procedure TForm1.MedianImage(Param: Integer); var pf: TPixelFormat; begin if not (Paran in [0..100]) then // ノイズ除去の度合いは、0 〜 100 の範囲で Exit; pf := TurboImage1.Picture.Bitmap.PixelFormat; if pf = pf4bit then // 4 ビット 16 色カラーの場合 TurboImage1.Picture.Bitmap.PixelFormat := pf8bit; TurboImage1.Median(Param); // ノイズを除去する。 if pf = pf4bit then TurboImage1.Picture.Bitmap.PixelFormat := pf; // もとに戻す。 end; 【 新しくなった点 】 // Version 0.2 // ・procedure Bright(Param: Integer); で Param の範囲を 0 〜 200 から 0 〜 ∞ に変更しました。 ・コントラストの調整に別のアルゴリズムを採用しこれまでとは、別のメソッド になりました。procedure Contrast(Param: Integer; Border: Integer); ・画像の明るさを調整するメソッド procedure Light(Param: Integer); を追加しました。Bright() とはまた別の方法で明るさを調整します。 ・階調値の分布(画像の明るさの分布)を指定範囲内に収めるメソッド procedure Distribution(ParamMin: Integer; ParamMax: Integer); を追加しました。 ・表示中の画像のヒストグラムを別の指定された、ビットマップあるいは、 メタファイルのキャンバスに描画するメソッド procedure Histgram(var ToDraw: TGraphic; Size: Integer; Step: Integer); を追加しました。 // Version 0.3 // ・ヒストグラムグラフ上のたて軸の最大値を任意指定あるいは自動設定する ことが可能になりました。 procedure Histgram(var ToDraw: TGraphic; Size: Integer; Step: Integer; H:Integer); // Version 0.4 // ・画像をスムーズできれいに拡大するメソッド procedure Enlarge(ParamWidth: Integer; ParamHeight: Integer); を追加しました。 ・画像をスムーズできれいに縮小するメソッド procedure Shrink(ParamWidth: Integer; ParamHeight: Integer); を追加しました。 ・画像をスムーズできれいに拡大・縮小するメソッド procedure Stretches(ParamWidth: Integer; ParamHeight: Integer); を追加しました。 ※通常は、Canvas の StretchDraw() メソッドで画像の拡大や縮小を行なう 事が多いのですが、この際画像にギザギザの線が出ることがままあります。 上記の Enlarge(), Shrink(), Stretches() を使用すれば、この様な現象 を避ける事が出来ます。 // Version 0.5 // ・ビットマップ画像を 6 種類の方法で 256 色に減色するメソッド procedure Reduce(Param: TReduceType); を追加しました。TReduceType は、以下の様に定義されています。 TReduceType = (rdcOctree, // Octree で減色 rdcMedianCut, // MedianCut で減色 rdcMedianCutV, // MedianCut + 分散で減色 rdcMedianCutE, // MedianCut + 誤差拡散で減色 rdcMedianCutVE, // MedianCut + 分散 + 誤差拡散で減色 rdcStaticE); // 固定パレット + 誤差拡散で減色 ※減色処理に関しましては、大部分を中村 拓男さんのコードに依存して います。中村 拓男さん、有り難う御座いました。 // Version 0.6 // ・トリミングを行なうメソッド procedure Trimming(ParamR: TRect; ParamG: Boolean); を追加しました。 // Version 0.7 // ・16 bit Color のビットマップを処理しようとするとうまく動作しない点を 修正しました。これは、画面の色数が、16 bit Color の時に Bitmap := TBitmap.Create; とすると、16 bit Color のビットマップが作成され、PixelFormat の値が pf16bit ではなく pfcustom となってしまう事が原因でした。これを防ぐ 為に主な手続き内では、16 bit Color のビットマップを 24 bit Color に 変換して処理をしています。 ・階調値の分布(画像の明るさの分布)を指定範囲内に収めるメソッド procedure Distribution(ParamMin: Integer; ParamMax: Integer); で、分布の指定範囲を広げました。最小値 ParamMin は、 -255 〜 255 で、 最大値 ParamMax は、0 〜 510 で指定する様にしました。 【 収録ファイル 】 TurboImg.pas - TTurboImage 本体のソースファイル TurboImg.dcr - TTurboImage のアイコン用ファイル Reduce.pas - 減色処理に必要なクラスや関数を含むユニット Readme.txt - このファイル Test.exe - TTurboImage を使用したサンプルアプリケーション Test.lzh - サンプルアプリケーションのソースファイル Image1.bmp - ビットマップのサンプル画像 Image2.jpg - JPEG のサンプル画像 Image3.emf - メタファイルのサンプル画像 Image4.ico - アイコンのサンプル画像 【 TTurboImage のインストール方法 】 適当なフォルダを作成して、その中に TurboImg.pas と TurboImg.dcr と Reduce.pas をコピーしてからコンポーネントのインストールで、 TurboImg.pas を選択して下さい。 【 使用環境 】 TTurboImage は、ScanLine を使用して処理をしている関係上、Delphi 4 および C++Builder 4 以前の環境では使用出来ません。 【 参考資料 】 中村 拓男 著(ソフトバンクパブリッシング発行) Delphi Graphic Secrets Know-how & Libraries 中村 拓男さん、有難うございました。 【 著作権 】 このプログラムの著作権は、seizo が有します。 【 ソフトウェア種別 】 このプログラムはフリーソフトウェアです。以下の事項を御承諾頂ければ、 自由にコピー、使用、配布を行なって頂いて構いません。 ◎このプログラムを使用した上でのいかなる損害、損失にも当方は一切 責任を負いません。このプログラムの使用は、使用者の責任において 行なって下さい。 ◎このプログラムを配布される場合は、このドキュメントファイルも含め 全てのファイルをオリジナルの状態で配布して下さい。 【 その他 】 TTurboImage の感想やバグレポート等何でも構いませんのでお寄せ下さい。 可能な限り御返事致します。 ◎seizoの連絡先 e-mail : seizo@mars.dti.ne.jp 他のコンポーネントやアプリ等をここで紹介しています。 http://www.vector.co.jp/vpack/browse/person/an003597.html