|
||
解説: 画像ビューアなどのソフトを作ると、画像ファイルの読み込みの遅さを解消する工夫が必要になります。特に何度も同じ画像を読み込む場合、できるだけ処理を軽くしたいものです。そうしたとき重い読み込みを繰り返すのではなく、キャッシュファイルを利用して二度目の読み込みを軽減するとよいでしょう。 今回、キャッシュファイルの作成は TFileStream を使っています。 使用例: アプリケーションを起動して、Button1 をクリックすると、画像ファイルがキャッシュに記録され、ファイルとして保存されます。 Button2 をクリックすると、キャッシュファイルから画像ファイルが読み込まれ、Image に表示されます。 準備としては、Image、Button をふたつずつ適当に配置してください。 "sample1.bmp", "sample12.bmp" は適当な画像ファイルを用意しておいてください。 Button1 の OnClick イベントハンドラでは、各ファイルのサイズが分かるように、[Seek 位置] [n 番画像] のようなフォーマットで TFileStream に記録していきます。 Button2 の OnClick イベントハンドラでは、キャッシュファイルに格納された画像データを Seek 位置を頼りに呼び出して、Image に表示して行きます。 画像は Jpeg を使うことが多いと思いますので、読み込めるよう処理を追加してみてください。 小さなファイルだとキャッシュファイルの効果が分かりづらいので、大きなサイズの画像を大量に読み込んで、その効果を実感してみると良いでしょう。 //------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { // 指定した名前でファイルを作成 TFileStream *fs = new TFileStream("abc.dat", fmCreate); // Seek 位置記録 int seekpos = 0; fs->Write(&seekpos, sizeof(int)); // 画像を読み込む Graphics::TBitmap *bmp = new Graphics::TBitmap; bmp->LoadFromFile("sample.bmp"); // オブジェクトを Stream に保存 bmp->SaveToStream(fs); // Seek 位置記録 seekpos = fs->Size; fs->Write(&seekpos, sizeof(int)); // 画像を読み込む bmp->LoadFromFile("sample2.bmp"); // オブジェクトを Stream に保存 bmp->SaveToStream(fs); delete bmp; delete fs; } //------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { // 読み出し用にファイルを開く TFileStream *fs = new TFileStream("abc.dat", fmOpenRead); int seekpos; fs->Read(&seekpos, sizeof(int)); // ストリームから読み込んだビットマップを表示 Image1->Picture->Bitmap->LoadFromStream(fs); // Seek 位置 fs->Read(&seekpos, sizeof(int)); // ストリームから読み込んだビットマップを表示 Image2->Picture->Bitmap->LoadFromStream(fs); delete fs; } //------------------------------------------------------------------- |