パンダのメモ帳

技術系のネタをゆるゆると

BitmapData のリサイズ(拡大・縮小)

AS3で画像(BitmapData)をリサイズ(拡大・縮小)する方法について。

1. 手順

  1. 元となる BitmapData オブジェクト(A)を用意する。
  2. 新しい空の BitmapData オブジェクト(B)をリサイズ後のサイズで生成する。
  3. Matrix オブジェクトを使って(B)にリサイズされた(A)を描画(draw)する。

2. サンプルスクリプト

import flash.geom.Matrix;
import flash.display.BitmapData;

/**
 *
 * BitmapData のリサイズ
 *
 * @param       BitmapData      src         元となる BitmapData オブジェクト
 * @param       Number          hRatio      水平方向のリサイズ比率
 * @param       Number          vRatio      垂直方向のリサイズ比率
 * @return      BitmapData      リサイズされた BitmapData オブジェクト
 *
 */
public function resize(src:BitmapData, hRatio:Number, vRatio:Number):BitmapData
{
  var res:BitmapData = new BitmapData(
    Math.ceil(src.width * hRatio), Math.ceil(src.height * vRatio)
  );
  res.draw(src, new Matrix(hRatio, 0, 0, vRatio), null, null, null, true);
  return res;
}

3. 解説

BitmapData オブジェクトの draw メソッドの第2引数(matrix)に Matrix オブジェクトを渡すことで描画される画像の拡大・縮小・回転・変形などが可能となる。今回はリサイズ(拡大・縮小)が目的のため、以下のように Matrix オブジェクトを生成した。hRatio は水平方向(幅)の拡大/縮小率、vRatio は垂直方向(高さ)の拡大/縮小率。

new Matrix(wRatio, 0, 0, hRatio);

また、同メソッドの第6引数(smoothing)を true とすることで、拡大・縮小されたときに画像が粗くなってしまうことを防いでいる。
なお、hRatio と vRatio に同じ値を指定することで、アスペクト比を維持したままリサイズすることも可能。

4. 参考