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