Delphi XE5でFireMonkeyのTBitmapの画像サイズを変更する

Delphi XE5でFireMonkeyのTBitmapの画像サイズを変更する方法を調べてみました。

画像サイズを縮小する

縮小した画像を作成する場合はTBitmap.CreateThumbnailメソッドを使用します。

var
  BitmapSource, BitmapSmall: TBitmap;
begin
  //画像ファイルを読み込む
  BitmapSource := TBitmap.CreateFromFile(FileName);
  //縮小した画像を作成する
  BitmapSmall := BitmapSource.CreateThumbnail(32, 32);

画像サイズを縮小する場合はTBitmap.Resizeメソッドを使用します。

var
  BitmapSource: TBitmap;
begin
  //画像ファイルを読み込む
  BitmapSource := TBitmap.CreateFromFile(FileName);
  //画像を縮小する
  BitmapSource.Resize(32, 32);

TBitmap.Resizeメソッドは内部でTBitmap.CreateThumbnailメソッドが使用されており、拡大はできないようです。

画像サイズを拡大する

画像サイズを拡大する場合はTCanvas.DrawBitmapメソッドを使用します。

/// <summary>
/// サイズを変更した画像を取得する
/// </summary>
/// <param name="Bitmap">
/// 元画像
/// </param>
/// <param name="Height">
/// 新しい画像の高さ
/// </param>
/// <param name="Width">
/// 新しい画像の幅
/// </param>
function ResizeImage(Bitmap: TBitmap; Height, Width: Integer): TBitmap;
var
  SrcRect: TRectF;
  DstRect: TRectF;
begin
  SrcRect.Left := 0;
  SrcRect.Top := 0;
  SrcRect.Bottom := Bitmap.Height;
  SrcRect.Right := Bitmap.Width;

  DstRect.Left := 0;
  DstRect.Top := 0;
  DstRect.Bottom := Height;
  DstRect.Right := Width;

  Result := TBitmap.Create;
  Result.Height := Height;
  Result.Width := Width;
  Result.Canvas.DrawBitmap(Bitmap, SrcRect, DstRect, 1.0);
end;

サンプルアプリケーション

次のサンプルアプリケーションでは、縦横64ピクセルの画像を読み込み、縦横32ピクセルと縦横128ピクセルにサイズを変更した画像を表示します。

実行結果

フォームにTImageコンポーネントを3つ配置します。
コンポーネントのNameはそれぞれImageSource,ImageSmall,ImageLargeにとします。

フォーム

ImageSourceはオリジナルのサイズ(64ピクセル)で画像を表示します。
ImageSmallは32ピクセルにサイズを変更した画像を表示します。
ImageLargeは128ピクセルにサイズを変更した画像を表示します。

/// <summary>
/// サイズを変更した画像を取得する
/// </summary>
/// <param name="Bitmap">
/// 元画像
/// </param>
/// <param name="Height">
/// 新しい画像の高さ
/// </param>
/// <param name="Width">
/// 新しい画像の幅
/// </param>
function ResizeImage(Bitmap: TBitmap; Height, Width: Integer): TBitmap;
var
  SrcRect: TRectF;
  DstRect: TRectF;
begin
  SrcRect.Left := 0;
  SrcRect.Top := 0;
  SrcRect.Bottom := Bitmap.Height;
  SrcRect.Right := Bitmap.Width;

  DstRect.Left := 0;
  DstRect.Top := 0;
  DstRect.Bottom := Height;
  DstRect.Right := Width;

  Result := TBitmap.Create;
  Result.Height := Height;
  Result.Width := Width;
  Result.Canvas.DrawBitmap(Bitmap, SrcRect, DstRect, 1.0);
end;

procedure TForm2.FormCreate(Sender: TObject);
const
  //画像ファイルの場所
  FileName: string = 'C:\data\arrow_left_64_h.png';
var
  BitmapSource, BitmapSmall, BitmapLarge: TBitmap;
begin
  // 画像ファイルを読み込む
  BitmapSource := TBitmap.CreateFromFile(FileName);
  ImageSource.Bitmap.Assign(BitmapSource);

  BitmapSource.Resize(32, 32);

  // 縮小した画像を作成する
  BitmapSmall := BitmapSource.CreateThumbnail(32, 32);
  ImageSmall.Bitmap.Assign(BitmapSmall);

  // 拡大した画像を作成する
  BitmapLarge := ResizeImage(BitmapSource, 128, 128);
  ImageLarge.Bitmap.Assign(BitmapLarge);

  BitmapSource.Free;
  BitmapSmall.Free;
  BitmapLarge.Free;
end;

コメント

  1. Pingback: Delphi XE5のFireMonkey のオーディオ/ビデオ機能にある「ビデオ キャプチャ」を改造して、フォームのサイズに合わせて動画が表示する - 山本隆の開発日誌

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください