Flash Player 11.3 と AIR 3.3 には、BitmapData クラスに新しい API が 2 つ追加されました。それぞれの使い方を簡単にご紹介します。
BitmapData.drawWithQuality
ビットマップの描画クオリティを引数に指定できるメソッドが追加されました。
これまでも、Stage.quality 属性を使って、描画の質を指定できましたが、これは全てのビットマップ描画に影響するものでした。新しく追加された drawWithQuality() メソッドを使えば、個々のビットマップに描画品質を指定できます。
これにより、例えば、デバイスのような CPU の性能に依存できない実行環境では、Stage の描画品質を low に設定して、パフォーマンス改善を図りつつ、きれいに見せたいときだけ、medium あるいは high を使う、といった手段が可能です。
(ちなみに、モバイル向けの AIR では、medium がデフォルト値です)
下が、drawWithQuality() メソッドの定義です。最後に引数が 1 つ追加された以外は draw() とおんなじです。
drawWithQuality(source:IBitmapDrawable, matrix:Matrix=null, colorTransform:ColorTransform =null, blendMode:String=null, clipRect:Rectangle=null, smoothing:Boolean=false, quality:String=null)
最後の quality に指定できる値は、StageQuality クラスに指定されています。
- StageQuality.LOW
- StageQuality.MEDIUM
- StageQuality.HIGH
- StageQuality.BEST
- StageQuality.HIGH_8X8
- StageQuality.HIGH_8X8_LINEAR
- StageQuality.HIGH_16X16
- StageQuality.HIGH_16X16_LINEAR
下の 4 つは今回追加された値で、Flash Player 11.3 以降のみで利用可能です。従来の HIGH と同じアルゴリズムを使いながら、アンチエイリアスに使用するピクセルを 4x4 から拡大したものです。名前の最後に LINEAR が付くものは、アンチエイリアスの計算を、リニア sRGB 空間で行います。
以下は、使い方の例です。
var textField:TextField = new TextField(); textField.text = "Hello World"; var bitmapData:BitmapData = new BitmapData(80, 20); // StageQuality.HIGH を指定してテキストをビットマップ化 bitmapData.drawWithQuality(textField, , , , , , StageQuality.HIGH);
BitmapData.encode
BitmapData.encode() メソッドは、BitmapData オブジェクトを PNG、JPEG、JPEG XR のいずれかのフォーマットにエンコードします。ネイティブの機能でエンコードが行われるため、高速に処理を行うことができます。特にデバイス環境では有効そうです。
BitmapData.encode() の定義は以下の通りです。戻り値は ByteArray です。
encode(rect:Rectangle, EncoderOptions:Object, bArray:ByteArray = null)
最初の引数は、BitmapData 内のエンコードする領域です。Rectangle オブジェクトで指定します。
2 つ目の引数は、エンコードのオブションを指定します。指定できるクラスは以下の 3 つです。エンコードしたいフォーマットに合ったものを選びます。
PNGEncoderOptions() JPEGEncoderOptions(quality:uint=80) JPEGXREncoderOptions(quantization:uint=20, colorSpace:String="auto", trimFlexBits:uint=0)
オプションによっては、引数をとるものがあります。例えば、JPEG の場合、引数に品質を 1 ~ 100 の間で指定します。
JPEG XR の場合はもう少し複雑です。JPEGXREncoderOptions のコンストラクタには 3 つの引数が用意されています。
最初の引数はデータの損失の度合いを 0 ~ 100 の間で指定します。0 であればデータロスが発生しません。20 を超えると画像が荒くなるため、10 当たりが良く使われるようです。
次の引数は、色空間変換のためのサンプリング方法の指定です。指定できる値は、BitmapEncodingColorSpace クラスに定義されています。
COLORSPACE_4_2_0 COLORSPACE_4_2_2 COLORSPACE_4_4_4 COLORSPACE_AUTO
通常はデフォルトの COLORSPACE_AUTO のままでよいようです。
3 つ目の引数は、量子化後のエントロピー符号化に使用するデータ量を指定します。通常は、画像の劣化を避けるためにデフォルト値を使います。
最後に、BitmapData.encode() のサンプルコードです。
var bitmapData:BitmapData = new BitmapData(640,480,false,0x00FF00); var byteArray:ByteArray = new ByteArray(); var rectangle:Rectangle = new Rectangle(0,0,640,480); // 標準の品質でJPEGにエンコード bitmapData.encode(rectangle, new JPEGCompressOptions(), byteArray); // 結果を表示する var loader:Loader = new Loader(); loader.loadBytes(byteArray);