サムネイル画像の作成(2001/9/2)

 MiViewやHTMLCatで使用しているサムネイル画像作成処理です。より多くの画像ファイルに対応するため実際の処理はもっと複雑ですが、サムネイルへの画像縮小方法はわかると思います。
 サンプルプロジェクトではTListBoxへのOwnerDraw処理で簡単なサムネイル一覧表示を行なっています。
 

const
  THUMBHT = 120; //サムネイル画像の高さ
  THUMBWD = 120; //サムネイル画像の幅

// サムネイル画像を作成する
procedure TForm1.MakeThumb(Fname: string);
var
  Thumbnl, bmp: TBitmap;
  jpg: TJpegImage;  // UsesにJpegを追加
  ext, fn: string;
  sr, dr: TRect;
  srt, sc: double;
  x, y: integer;
begin
  Thumbnl := TBitmap.Create;
  try
    // サムネイル画像の大きさをセット
    Thumbnl.Width := THUMBWD;
    Thumbnl.Height:= THUMBHT;
    // サムネイル画像の背景を白で塗りつぶす
    Thumbnl.Canvas.Brush.Color := clWhite;
    Thumbnl.Canvas.FillRect(Rect(0, 0, THUMBWD, THUMBHT));
    // ファイル拡張子を取得
    ext := AnsiUpperCase(ExtractFileExt(Fname));
    // 元画像を読込むBitmapを準備
    bmp := TBitmap.Create;
    try
      // ビットマップ
      if ext = '.BMP' then
      begin
        bmp  := TBitmap.Create;
        bmp.LoadFromFile(fname);
      // Jpeg
      end else if (ext = '.JPG') or (ext = '.JPEG') then
      begin
        jpg := TJpegImage.Create;
        try
          jpg.LoadFromFile(fname);
          bmp.Assign(jpg);
        finally
          Jpg.Free;
        end;
      end;
      x := bmp.Width;
      y := bmp.Height;
      try
        // サムネイル描画スケールを計算
        sc := x / y;
        // 縦横どちらが大きいかをチェックする
        // THUMBHTから16引いているのはファイル名を描画する部分を確保するため
        srt := (THUMBWD / (THUMBHT - 16)) / sc;
        if srt < 1.0 then
        begin
          x := THUMBWD;
          y := Trunc((THUMBHT - 16) * srt) - 1;
        end else begin
          x := Trunc(THUMBWD / srt) - 1;
          y := (THUMBHT - 16);
        end;
      except
        x := THUMBWD;
        y := (THUMBHT - 16);
      end;
      // コピー元の大きさをセット
      sr.Top := 0;
      sr.Left := 0;
      sr.Right := bmp.Width;
      sr.Bottom := bmp.Height;
      dr.Right := x;
      dr.Bottom := y;
      // コピー先(サムネイル)の大きさをセット
      if x < THUMBWD then
      begin
        dr.Left := (THUMBWD - x) div 2;
        dr.Right := dr.Right + dr.Left;
      end else
        dr.Left := 0;
      if y < (THUMBHT - 16) then
      begin
        dr.Top := ((THUMBHT - 16) - y) div 2;
        dr.Bottom := dr.Bottom + dr.Top;
      end else
        dr.Top := 0;
      // サムネイル画像へ書込み
      Thumbnl.Canvas.CopyMode := cmSrcCopy;
      Thumbnl.Canvas.StretchDraw(dr, bmp);
      // サムネイルに書込むファイル名を作成
      fn := ExtractFileName(fname);
      // ファイル名が長い場合には省略する
      if Length(fn) > 18 then
        fn := Copy(ExtractFileName(fn), 1, 12) + '...' + ExtractFileExt(fn);
      // ファイル名書込み
      SetTextAlign(Thumbnl.Canvas.Handle, TA_CENTER);
      TextOut(Thumbnl.Canvas.Handle, THUMBWD div 2, (THUMBHT - 14), PChar(fn), Length(fn));
    finally
      bmp.Free;
    end;
    // Image1.Picture.Bitmap.Assign(Thumbnl);
    // ここに作成したサムネイル画像を使用する処理を記述する
  finally
    Thumbnl.Free;
  end;
end;

サンプルプロジェクトのダウンロード(3,065byte)

サンプルプロジェクトにはFindFile, FolderDlg, ShfOperationの三つのコンポーネントが必要です。Delphi小技のページからダウンロードして下さい。

戻る