「まつり つくば 2007」より
早速、動作テストをした。
Turbo Delphi Explorer では、残念ながら新たなコンポーネントをインストール
できないようだ。また、コンパイラが検索するファイルパスも追加することが
できないようだ。そこで、自作の VCLImageUtils.pas やここやここでやった
PngImage、GifImage のユニットファイルは、ダウンロードして解凍した
すべてのファイルを、あらかじめパスが通っている $(BDS)lib ディレクトリに
すべてコピーした。これで使えるようになった。
テストとして、上記のすべてを使う LoadCheckedImage() 関数を試してみた。
うまくいっているようだ。
Turbo Delphi Explorer では、残念ながら新たなコンポーネントをインストール
できないようだ。また、コンパイラが検索するファイルパスも追加することが
できないようだ。そこで、自作の VCLImageUtils.pas やここやここでやった
PngImage、GifImage のユニットファイルは、ダウンロードして解凍した
すべてのファイルを、あらかじめパスが通っている $(BDS)lib ディレクトリに
すべてコピーした。これで使えるようになった。
テストとして、上記のすべてを使う LoadCheckedImage() 関数を試してみた。
うまくいっているようだ。
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} uses VCLImageUtils; procedure TForm1.Button1Click(Sender: TObject); var bmp: TBitmap; filename: string; begin filename := 'C:\Home\Img\hana.png'; bmp := LoadCheckedImage(filename); if Assigned(bmp) then begin Canvas.Draw(5, 5, bmp); bmp.Free; end; end; end.
Turbo Delphi Explorer for Win32 をインストールした。
PC を新しくして5ヶ月になるけど、やはり Delphi がないのはさびしい。
前の PC には Delphi5pro と Delphi6Personal が入っていたけど、
ちょっと古すぎな感じがする。
Delphi については、すっかり浦島太郎状態だが、お目当ての Delphi6Personal は
いまは使えないらしく、ここを参考にして Turbo Delphi Explorer for Win32 を
インストールした。これは、フリー版では最新のものであるらしい。
なんだか面倒な手続きがあって、BDN の登録からはじめて2時間ちかくかかったが
無事インストールに成功したらしい。いままでつくった画像処理用のライブラリを拡充して
いきたい。しばらく楽しめそうだ。
幾何反転による画像の反転。
元画像はこれ。
幾何反転は単純な座標変換だが、非常に面白い。
ちゃんと補間を行えば画像の劣化も目立たない。
[Geometric Inversion]
24ビットカラーの画像の中の色の数をかぞえるために、これまでに
ArrayList を使った関数をライブラリでつくってきた。ところで、
最近、申し訳ないがどこか探せないのだが Delphi で TBits クラスを
つかった実装を見かけた。論理的には、ArrayList で全色を保持して
ソートすることにより、色数をかぞえるよりスマートで、画像のサイズ
が大きくなるほど、速いと思われる。
C# で Delphi の TBits に相当するクラスは BitArray クラスである。
これは項目ごとに Boolean 値を保持できる。これをつかって、色を
かぞえるのは簡単かつソートがいらないので高速であるはずである。
さっそく試してみた。今回試した色をかぞえる画像はこれである。
ラ・フランドル、二ノ宮2、つくば市
結果は、以下に示すように、これまでの関数より2倍くらい速い。
ライブラリも変更することにしよう。
ArrayList を使った関数をライブラリでつくってきた。ところで、
最近、申し訳ないがどこか探せないのだが Delphi で TBits クラスを
つかった実装を見かけた。論理的には、ArrayList で全色を保持して
ソートすることにより、色数をかぞえるよりスマートで、画像のサイズ
が大きくなるほど、速いと思われる。
C# で Delphi の TBits に相当するクラスは BitArray クラスである。
これは項目ごとに Boolean 値を保持できる。これをつかって、色を
かぞえるのは簡単かつソートがいらないので高速であるはずである。
さっそく試してみた。今回試した色をかぞえる画像はこれである。
ラ・フランドル、二ノ宮2、つくば市
結果は、以下に示すように、これまでの関数より2倍くらい速い。
ライブラリも変更することにしよう。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Drawing.Imaging; using System.Drawing.Drawing2D; using ImageUtils; using System.Collections; namespace CountColors { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public static int CountColors(Bitmap bmp) { if (bmp.PixelFormat != PixelFormat.Format24bppRgb) return -1; int w = bmp.Width; int h = bmp.Height; BitArray ba = new BitArray(0x1000000, false); int count = 0; int indx; int ir; BmpProc24 src = new BmpProc24(bmp); for (int y = 0; y < h; y++) for (int x = 0; x < w; x++) { ir = src.IndexR(x, y); indx = (int)((((src[ir] << 8) | src[ir - 1]) << 8) | src[ir - 2]); if (!ba[indx]) { ba[indx] = true; count++; } } src.Dispose(); return count; } private void button1_Click(object sender, EventArgs e) { Bitmap bmp = new Bitmap(@"c:\Home\ImgWork\LaFlandre.png"); StopWatch.Start(); int cn = CountColors(bmp); StopWatch.Stop(); label1.Text = cn.ToString() + " colors"; label2.Text = StopWatch.time.ToString() + " ms"; StopWatch.Start(); cn = ImgUtils.CountColors(bmp); StopWatch.Stop(); label3.Text = cn.ToString() + " colors"; label4.Text = StopWatch.time.ToString() + " ms"; bmp.Dispose(); } } }