ビットマップについて
・ | BitmapData クラスについて |
・ | Bitmap クラスについて |
・ | BitmapData オブジェクトを作成する |
・ | BitmapData オブジェクトを解放する |
・ | 埋め込んだ画像ファイルを表示する |
・ | 外部から読み込んだ画像ファイルを表示する |
・ | ビットマップにレンダリング(キャプチャ)する |
・ | ビットマップの編集について |
・ | ビットマップの転送について |
・ | ビットマップのエフェクトについて |
BitmapData クラスについて
■ BitmapData クラスについて
BitmapData は、画像のデータです。
1つの BitmapData オブジェクトは、画像1枚分に相当します。
BitmapData クラスを使って、ビットマップを編集する事ができます。
ビットマップを画面に表示したい場合は、別途 Bitmap クラスを使用します。
■ BitmapData クラスの機能一覧
■プロパティ一覧(読み取り専用)
プロパティ名 | 型 | 説明 |
width | int | ビットマップの幅を取得する |
height | int | ビットマップの高さを取得する |
rect | Rectangle | ビットマップのサイズを Rectangle 型で取得する |
transparent | Boolean | 透過付き(32bit)ビットマップであるか? |
■メソッド
メソッド名 | 説明 |
lock() | BitmapData オブジェクトのロックを開始する。 |
unlock() | BitmapData オブジェクトのロックを終了する。 |
dispose() | BitmapData オブジェクトを解放する。 |
メソッド名 | 説明 |
getColorBoundsRect() | 指定カラーをすべて含む、矩形サイズを取得する。 |
hitTest() | ビットマップとの当たり判定を調べる。 |
compare() | 2つのビットマップを比較する。 |
histogram() | ビットマップのヒストグラムを取得する。 |
getPixel() | RGB ピクセルカラー(24bit)を取得する。 |
setPixel() | RGB ピクセルカラー(24bit)を設定する。 |
getPixel32() | ARGB ピクセルカラー(32bit)を取得する。 |
setPixel32() | ARGB ピクセルカラー(32bit)を設定する。 |
getPixels() | ARGB ピクセルカラーをまとめて取得する。(ByteArray 型) |
setPixels() | ARGB ピクセルカラーをまとめて設定する。(ByteArray 型) |
getVector() | ARGB ピクセルカラーをまとめて取得する。(Vector 型) |
setVector() | ARGB ピクセルカラーをまとめて設定する。(Vector 型) |
fillRect() | ビットマップを塗りつぶす(矩形指定) |
floodFill() | ビットマップを塗りつぶす(塗りつぶしツール方式) |
draw() | ビットマップにレンダリング(キャプチャ)する |
メソッド名 | 説明 |
clone() | BitmapData オブジェクトを複製する |
copyChannel() | イメージを高速コピーする(カラーチャンネル単位) |
copyPixels() | イメージを高速コピーする(ピクセルカラー) |
paletteMap() | イメージを転送する(パレットマップによる変換) |
threshold() | イメージを転送する(しきい値による抽出) |
scroll() | イメージをスクロールする。 |
merge() | 2つのイメージをマージする。 |
メソッド名 | 説明 |
colorTransform() | カラートランスフォーム変換後の結果を描画する。 |
applyFilter() | フィルタ適用後の結果を描画する。 |
generateFilterRect() | フィルタ適用後のサイズを取得する。 |
noise() | ランダムノイズを描画する。 |
perlinNoise() | パーリンノイズを描画する(Perlin Noise) |
pixelDissolve() | イメージをピクセルディゾルブで置換する |
Bitmap クラスについて
■ Bitmap クラスについて
Bitmap クラスは、表示オブジェクトの一種です。
1つの BitmapData オブジェクトを、画面に表示する事ができます。
■ Bitmap クラスの派生
Bitmap クラスは、以下の様に派生しています。
ここで解説してない分は、リンク先に解説がありますので合わせてご覧下さい。
Object |
↓派生 |
EventDispatcher |
↓派生 |
DisplayObject |
↓派生 |
Bitmap |
■ Bitmap クラスの機能一覧
■プロパティ一覧
プロパティ名 | 型 | 説明 |
bitmapData | BitmapData | 表示する BitmapData を設定する |
pixelSnapping | String | PixelSnapping を設定する (PixelSnapping.*) |
smoothing | Boolean | スムージングの有無を設定する |
■PixelSnapping の設定(pixelSnapping プロパティ)
PixelSnapping には、以下の種類があります。
デフォルトは、PixelSnapping.AUTO です。
定数 | 文字列 | 解説 |
PixelSnapping. | "auto" | PixelSnapping を使用する(傾斜がなく、等倍に極めて近い場合のみ) |
PixelSnapping. | "always" | PixelSnapping を使用する(常に) |
PixelSnapping. | "never" | PixelSnapping を使用しない |
■ PixelSnapping の "auto" モードについて
これは、最終的なモニタスクリーン座標系に対して作用します。
ビットマップが、「約 99.9% ~ 100.1% の拡大率」かつ「傾斜がない」
この条件を満たしている場合、PixelSnapping が発動します。
座標が小数値を含む場合、整数位置に補正されます。
拡大率は、等倍(100%)に補正されます。
これにより、滲むことなく、高速でレンダリングされるようになります。
Dot by Dot と同じです。
■スムージング の設定(smoothing プロパティ)
false を指定した場合、ニアレストネイバーで表示されます。
true を指定した場合、バイリニアフィルタで表示されます。
デフォルトは、false です。
false | true |
■ビットマップを表示する
1.Bitmap オブジェクトを作成する
new 演算子を使って、Bitmap クラスをインスタンス化します。
new Bitmap ( bitmapData , pixelSnapping , smoothing ) :Bitmap
第01引数(略可) | BitmapData | bitmapData プロパティと同等 |
第02引数(略可) | String | pixelSnapping プロパティと同等 |
第03引数(略可) | Boolean | smoothing プロパティと同等 |
戻り値 | Bitmap | Bitmap オブジェクトが得られる。 |
Bitmap オブジェクトを作成する
import flash.display.Bitmap;
// Bitmap オブジェクトを作成する
var bitmap_obj:Bitmap = new Bitmap();
// 出力テスト
trace(bitmap_obj);
2.Bitmap オブジェクトに、BitmapData をセットする
bitmapData プロパティを使用します。
3.Bitmap オブジェクトを配置する
Bitmap オブジェクトを、任意の表示リストに登録します。
ビットマップを画面に表示する
import flash.display.BitmapData;
import flash.display.Bitmap;
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 256 , 256 , true , 0xffcc8800 );
// ------------------------------------------------------------
// Bitmap オブジェクトを作成する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap();
// ------------------------------------------------------------
// BitmapData をセットする
// ------------------------------------------------------------
bitmap_obj.bitmapData = bmp_data;
// ------------------------------------------------------------
// ステージの表示リストに登録する
// ------------------------------------------------------------
stage.addChild(bitmap_obj);
BitmapData オブジェクトを作成する
サンプルをダウンロード
BitmapData オブジェクトを作成する(単一色)
new 演算子を使って、BitmapDeta クラスをインスタンス化します。
単一色で初期化されます。
引数で設定するパラメータは、後から変更できません。
new BitmapData( 幅 , 高さ , 32bitカラー? , 初期カラー ) :BitmapData
第01引数 | int | ビットマップの幅 |
第02引数 | int | ビットマップの高さ |
第03引数(略可) | Boolean | true の場合、透過ありビットマップ(32bitカラー) false の場合、透過なしビットマップ(24bitカラー) デフォルトは true |
第04引数(略可) | uint | 初期カラーを指定、デフォルトは 0xFFFFFFFF 32bitカラーならARGB値を指定 24bitカラーならRGB値を指定 |
戻り値 | BitmapData | 新しい BitmapData オブジェクトが得られる |
■第04引数(初期カラー)
単一色で塗りつぶす色(ARGB)を指定します。
指定した色が、実際に書き込まれるとは限りません。
アルファ値によって、赤緑青は丸められます。
■ BitmapData オブジェクトの作成例(24bit)
24bitカラーの BitmapData オブジェクトを作成
import flash.display.BitmapData;
import flash.display.Bitmap;
// ------------------------------------------------------------
// 初期化パラメータ
// ------------------------------------------------------------
// ビットマップの幅
var width:int = 400;
// ビットマップの高さ
var height:int = 300;
// 単一色で塗りつぶす RGB カラー
var color_rgb:uint = 0xFFCC88;
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(24bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( width , height , false , color_rgb );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
■ BitmapData オブジェクトの作成例(32bit)
32bitカラーの BitmapData オブジェクトを作成
import flash.display.BitmapData;
import flash.display.Bitmap;
// ------------------------------------------------------------
// 初期化パラメータ
// ------------------------------------------------------------
// ビットマップの幅
var width:int = 400;
// ビットマップの高さ
var height:int = 300;
// 単一色で塗りつぶす ARGB カラー
var color_argb:uint = 0x80FFCC88;
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( width , height , true , color_argb );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
利用可能なビットマップのサイズ上限について
■Flash Player 9 以前の場合
幅と高さが 2880 ピクセルまでのビットマップを作成できます。
■Flash Player 10 の場合
幅と高さが 8192 ピクセルまでのビットマップを作成できます。
総ピクセル数は 16777216 までとなります。
(幅が 8192 なら、高さは 2048 まで)
■Flash Player 11 以降の場合
サイズの制限はありません。
実際の限界サイズは、OS ごとに異なります。
BitmapData オブジェクトを表示する
別途、Bitmap クラスを使用します。
BitmapData オブジェクトを解放する
サンプルをダウンロード
■BitmapData オブジェクトを解放する
BitmapData クラスには、メモリ解放用のメソッドが用意されています。
ガベージコレクションでも解放されますが、すぐに実行されるとは限りません。
特に BitmapData オブジェクトは、メモリサイズが巨大になりがちです。
不要になった場合、即解放するように心掛けます。
■BitmapData オブジェクトを解放する
dispose() メソッドを使用します。
高さ 0 幅 0 である、BitmapData オブジェクトに変化します。
BitmapData オブジェクトを再利用する事はできません。
BitmapData.dispose ( ) :void
引数 | void | なし |
戻り値 | void | なし |
■使用例
BitmapData オブジェクトを解放する
import flash.display.BitmapData;
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 400 , 300 );
// ------------------------------------------------------------
// BitmapData オブジェクトを解放する
// ------------------------------------------------------------
bmp_data.dispose();
bmp_data = null;
埋め込んだ画像ファイルを表示する
サンプルをダウンロード
■埋め込んだ画像ファイルを表示する
画像ファイルを、 swf ファイルに埋め込む事ができます。
埋め込んだ画像ファイルは、動的に表示する事ができます。
■画像ファイルを埋め込む(Adobe Flash の場合)
1.リンケージプロパティを開く
ライブラリウィンドウを開きます。
使用したい画像ファイルから、リンケージプロパティを選択します。
2.自作クラスを設定する
リンケージプロパティというダイアログが開きます。
「クラス」に好きな名称を付けます。
ここでは、"MyBitmapData" と名前を付けます。
「基本クラス」に、「flash.display.BitmapData 」を設定します。
『ActionScript に書き出し』と『最初のフレームに書き出し』にチェックを付けます。
3.Flash を書き出して、データの埋め込みを確認する
この状態で、Flash を書き出します。
すると、swf ファイルにデータが埋め込まれるようになります。
プロファイラ機能を使用すると、データが埋め込まれたか確認できます。
タイムラインの1フレーム目のサイズが増えているでしょう。
4.BitmapData オブジェクトを作成する
MyBitmapData クラスを、new 演算子を使ってインスタンス化します。
このクラスは、BitmapData クラスを継承しています。
第01~02引数の指定は無意味ですが、環境によっては省略できません。
ダミー値として、0 を設定するといいでしょう。
MyBitmapData クラスをインスタンス化して、BitmapData オブジェクトを作成する
import flash.display.BitmapData;
import flash.display.Bitmap;
// ------------------------------------------------------------
// 埋め込んだ画像ファイルから、BitmapData オブジェクトを作成する (自作クラス "MyBitmapData" )
// ------------------------------------------------------------
var bmp_data:BitmapData = new MyBitmapData( 0 , 0 );
// 出力テスト
trace(bmp_data);
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
■画像ファイルを埋め込む(FlashDevelop の場合)
1.プロジェクトに画像ファイルを追加する
プロジェクトウィンドウの、任意のフォルダを選択します。
「Add」→「Library Asset」を選択します。
ファイル選択ダイアログが開くので、画像ファイルを選択します。
2.埋め込みアセットクラスを設定する
追加された画像ファイルを選択して、「Generate Embed Code」を選択します。
[Embed(source="xxx")] という、メタデータタグが出力されます。
続けて、クラス名を宣言します。
ここでは、"MyBitmap" と名前を付けます。
Embed メタタグは、Adobe Flash CS4 以降でも利用可能です。
埋め込みアセットクラスを設定する
package
{
import flash.display.Sprite;
// ------------------------------------------------------------
// Main クラス
// ------------------------------------------------------------
public class Main extends Sprite
{
// ------------------------------------------------------------
// 埋め込みアセットクラス
// ------------------------------------------------------------
[Embed(source = "../resource/sample.png")]
private var MyBitmap:Class;
// ------------------------------------------------------------
// コンストラクタ
// ------------------------------------------------------------
public function Main():void {
}
}
}
3.Flash を書き出して、データの埋め込みを確認する
この状態で、Flash を書き出します。
すると、swf ファイルにデータが埋め込まれるようになります。
swf ファイルのサイズが増えたか、確認します。
4.Bitmap オブジェクトを作成する
MyBitmap クラスを、new 演算子を使ってインスタンス化します。
引数は、省略します。
このクラスは、Bitmap クラスを継承しています。
5.BitmapData オブジェクトを取得する
BitmapData オブジェクトも同時に生成されます。
取得するには、bitmapData プロパティを使用します。
MyBitmap クラスをインスタンス化して、Bitmap オブジェクトを作成する
package
{
import flash.display.Sprite;
import flash.display.BitmapData;
import flash.display.Bitmap;
// ------------------------------------------------------------
// Main クラス
// ------------------------------------------------------------
public class Main extends Sprite
{
// ------------------------------------------------------------
// 埋め込みコード
// ------------------------------------------------------------
[Embed(source = "../resource/sample.png")]
private var MyBitmap:Class;
// ------------------------------------------------------------
// コンストラクタ
// ------------------------------------------------------------
public function Main():void {
// ------------------------------------------------------------
// 埋め込んだ画像ファイルから、Bitmap オブジェクトを作成する (自作クラス "MyBitmap" )
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new MyBitmap();
// 出力テスト
trace(bitmap_obj);
// ------------------------------------------------------------
// BitmapData オブジェクトを取得する
// ------------------------------------------------------------
var bmp_data:BitmapData = bitmap_obj.bitmapData;
// 出力テスト
trace(bmp_data);
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
stage.addChild( bitmap_obj );
}
}
}
ビットマップにレンダリング(キャプチャ)する
サンプルをダウンロード
■ビットマップにレンダリング(キャプチャ)する
draw() メソッドを使用します。
Flash 上のラスターやベクターなどを、BitmapData に描画できます。
描画したい素材を、ソースといいます。
描画先のビットマップを、ターゲットといいます。
ターゲットの、元のイメージは重要です。
新しいレンダリングは、元のイメージに上書き合成されます。
BitmapData.draw( ソース , Matrix , ColorTransform , ブレンドモード , Rectangle , スムージング? ) :void
第01引数 | * | ソースとなる「別の BitmapData」や「DisplayObject」を指定 |
第02引数(略可) | Matrix | ソースの姿勢を、Matrix 型で指定 |
第03引数(略可) | ColorTransform | ソースのカラー変換を、ColorTransform 型で指定 |
第04引数(略可) | String | ターゲットと新しいソースとの、ブレンドモードを指定 |
第05引数(略可) | Rectangle | ターゲット側の描画範囲を限定したい場合、矩形を Rectangle 型で指定 |
第06引数(略可) | Boolean | スムージングを有効にするなら true を指定、デフォルトは false |
戻り値 | void | なし |
■第01引数 ソース
描画したいソースを指定します。
「別の BitmapData」や、「DisplayObject」を指定します。
表示オブジェクトを指定した場合、現在の姿勢は考慮されません。
位置、姿勢、カラー、ブレンドなどは無視されます。
■第02引数 ソースの姿勢
ターゲットのビットマップ座標系に、ソースを配置します。
ソースの姿勢を、行列で指定します。
■第03引数 カラートランスフォーム
こちらで解説しています。
■第04引数 ブレンドの種類
■第05引数 ターゲット側の描画範囲
ターゲットの描画範囲を限定したい場合に指定します。
null を指定した場合、ターゲット全体が描画対象となります。
■第06引数(スムージング)
ソースが、BitmapData である場合に、効果があります。
false を指定した場合、ニアレストネイバーで描画されます。
true を指定した場合、バイリニアフィルタで描画されます。
デフォルトは、false です。
false | true |
■ビットマップにステージ全体を描画する例
ビットマップに、ステージをレンダリングする
import flash.display.BitmapData;
import flash.display.Bitmap;
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0xFF00FF00 );
// ------------------------------------------------------------
// ビットマップに描画する(ソースはステージ全体)
// ------------------------------------------------------------
bmp_data.draw( stage );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
■ビットマップに表示オブジェクトを描画する例
ビットマップに表示オブジェクトを描画する
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.display.Shape;
import flash.display.Graphics;
import flash.display.GradientType;
import flash.geom.Matrix;
import flash.geom.ColorTransform;
import flash.geom.Rectangle;
// ------------------------------------------------------------
// ソース用の表示オブジェクトを作成
// ------------------------------------------------------------
var shape:Shape = (function():Shape{
// ------------------------------------------------------------
// Shape オブジェクトを作成
// ------------------------------------------------------------
var shape:Shape = new Shape();
// ------------------------------------------------------------
// 矩形を描画
// ------------------------------------------------------------
var g:Graphics = shape.graphics;
var mtx:Matrix = new Matrix(320/1638.4,0,0,1,160,0);
g.lineStyle (5, 0x505050, 100);
g.beginGradientFill ( GradientType.LINEAR , [0xFF8080,0x8080FF] , [1.0,1.0] , [0,255] , mtx);
g.moveTo ( 0 , 0 );
g.lineTo ( 0 , 240 );
g.lineTo ( 320 , 240 );
g.lineTo ( 320 , 0 );
g.endFill();
return shape;
})();
// ------------------------------------------------------------
// BitmapData オブジェクト
// ------------------------------------------------------------
var bmp_data:BitmapData = (function():BitmapData{
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0x20000000 );
// ------------------------------------------------------------
// ソースの姿勢
// ------------------------------------------------------------
// 行列を作成(単位行列)
var mtx:Matrix = new Matrix();
// 移動成分を乗算
mtx.translate(20 , 20);
// ------------------------------------------------------------
// ソースのカラートランスフォーム
// ------------------------------------------------------------
var color_transform:ColorTransform = new ColorTransform();
// ------------------------------------------------------------
// ターゲット側の描画範囲
// ------------------------------------------------------------
var target_clip:Rectangle = new Rectangle(0 , 0 , 512 , 512);
// ------------------------------------------------------------
// ビットマップに描画する(ソースは表示オブジェクト)
// ------------------------------------------------------------
bmp_data.draw( shape , mtx , color_transform , "normal" , target_clip );
return bmp_data;
})();
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
■キャプチャー関連のセキュリティについて
キャプチャー処理には、セキュリティ上の制限があります。
■クロスドメインポリシーの制限について
別ドメインに格納されている、画像や動画などのメディアファイルを、読み込んで表示している場合、それらをキャプチャーすることはできません。
■クロスドメインポリシーの解除について
クロスドメインポリシーは、解除できます。
こちらで解説しています。
ビットマップの編集について
■ビットマップから1つのピクセルカラーを取得する
■ RGB カラー(24bit)を取得する
getPixel() メソッドを使用します。
BitmapData.getPixel( x , y ) :uint
第01引数 | int | 水平方向のピクセル位置 |
第02引数 | int | 垂直方向のピクセル位置 |
戻り値 | uint | RGB カラー値が得られる |
■ ARGB カラー(32bit)を取得する
getPixel32() メソッドを使用します。
BitmapData.getPixel32( x , y ) :uint
第01引数 | int | 水平方向のピクセル位置 |
第02引数 | int | 垂直方向のピクセル位置 |
戻り値 | uint | ARGB カラー値が得られる |
■使用例
ピクセルカラーを取得する
import flash.display.BitmapData;
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0xFFFFFFFF );
// ------------------------------------------------------------
// RGB カラー(24bit)を取得する
// ------------------------------------------------------------
var color_rgb0:uint = bmp_data.getPixel( 0 , 0 );
var color_rgb1:uint = bmp_data.getPixel( 1 , 5 );
var color_rgb2:uint = bmp_data.getPixel( 20 , 10 );
// ------------------------------------------------------------
// ARGB カラー(32bit)を取得する
// ------------------------------------------------------------
var color_argb0:uint = bmp_data.getPixel32( 0 , 0 );
var color_argb1:uint = bmp_data.getPixel32( 1 , 5 );
var color_argb2:uint = bmp_data.getPixel32( 20 , 10 );
// ------------------------------------------------------------
// 各カラー成分を取得
// ------------------------------------------------------------
var a:uint = (color_argb0 >>> 24) & 0xff;
var r:uint = (color_argb0 >>> 16) & 0xff;
var g:uint = (color_argb0 >>> 8) & 0xff;
var b:uint = (color_argb0 >>> 0) & 0xff;
■ビットマップからピクセルカラーをまとめて取得する
■ ByteArray 型でまとめて取得する
getPixels() メソッドを使用します。
ARGBカラー(32bit)が、順番に格納されています。
(透過|赤|緑|青) | (透過|赤|緑|青) | (透過|赤|緑|青) ...
透過なし(24bit)ビットマップの場合でも、透過成分は含まれます。
BitmapData.getPixels( Rectangle ) :ByteArray
第01引数 | Rectangle | 取得したい範囲を Rectangle 型で指定 |
戻り値 | ByteArray | ByteArray オブジェクトが得られる。ARGBカラー(32bit)の連続したデータ |
■ Vector 型でまとめて取得する (Flash 10 以降)
getVector() メソッドを使用します。
Vector オブジェクトのベース型は、uint です。
ARGBカラー(32bit)が、順番に格納されています。
BitmapData.getVector( Rectangle ) :Vector.<uint>
第01引数 | Rectangle | 取得したい範囲を Rectangle 型で指定 |
戻り値 | Vector.<uint> | Vector オブジェクトが得られる。ARGBカラー(uint)の連続したデータ |
■使用例
ピクセルカラーをまとめて取得する
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.utils.ByteArray;
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 4 , 4 , true , 0xFFFFFFFF );
// ------------------------------------------------------------
// 取得する句形範囲
// ------------------------------------------------------------
var rect:Rectangle = bmp_data.rect;
var i:int;
var num:int = rect.width * rect.height;
// ------------------------------------------------------------
// ByteArray 型でまとめて取得する
// ------------------------------------------------------------
var byte_array:ByteArray = bmp_data.getPixels(rect);
byte_array.position = 0;
for(i=0;i < num;i++){
// 位置と、ARGB カラーを取得
var x:int = (i % rect.width) + rect.x;
var y:int = Math.floor(i / rect.width) + rect.y;
var color_argb:uint = byte_array.readUnsignedInt();
// 出力テスト
trace(x , y , color_argb.toString(16));
}
// ------------------------------------------------------------
// Vector 型でまとめて取得する
// ------------------------------------------------------------
var vector:Vector.<uint> = bmp_data.getVector(rect);
for(i=0;i < num;i++){
// 位置と、ARGB カラーを取得
var x:int = (i % rect.width) + rect.x;
var y:int = Math.floor(i / rect.width) + rect.y;
var color_argb:uint = vector[i];
// 出力テスト
trace(x , y , color_argb.toString(16));
}
■ビットマップに1つのピクセルカラーを書き込む
■ RGB カラー(24bit)を書き込む
setPixel() メソッドを使用します。
指定ピクセルに、アルファ成分がある場合、そのまま残ります。
指定した色が、実際に書き込まれるとは限りません。
アルファ値によって、赤緑青は丸められます。
BitmapData.setPixel( x , y , color ) :void
第01引数 | int | 水平方向のピクセル位置 |
第02引数 | int | 垂直方向のピクセル位置 |
第03引数 | uint | RGB カラー値を指定する |
戻り値 | void | なし |
■ ARGB カラー(32bit)を書き込む
setPixel32() メソッドを使用します。
指定した色が、実際に書き込まれるとは限りません。
アルファ値によって、赤緑青は丸められます。
BitmapData.setPixel32( x , y , color ) :void
第01引数 | int | 水平方向のピクセル位置 |
第02引数 | int | 垂直方向のピクセル位置 |
第03引数 | uint | ARGB カラー値を指定する |
戻り値 | void | なし |
■使用例
ピクセルカラーを書き込む
import flash.display.BitmapData;
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0xFFFFFFFF );
// ------------------------------------------------------------
// RGB カラー(24bit)を書き込む
// ------------------------------------------------------------
bmp_data.setPixel( 0 , 0 , 0x001122 );
bmp_data.setPixel( 1 , 5 , 0xaabbcc );
bmp_data.setPixel( 20 , 10 , 0xff8800 );
// ------------------------------------------------------------
// ARGB カラー(32bit)を書き込む
// ------------------------------------------------------------
bmp_data.setPixel32( 0 , 0 , 0xff001122 );
bmp_data.setPixel32( 1 , 5 , 0xffaabbcc );
bmp_data.setPixel32( 20 , 10 , 0x20ff8800 );
// ------------------------------------------------------------
// RGB カラー(24bit)を取得する
// ------------------------------------------------------------
var color_rgb0:uint = bmp_data.getPixel( 0 , 0 );
var color_rgb1:uint = bmp_data.getPixel( 1 , 5 );
var color_rgb2:uint = bmp_data.getPixel( 20 , 10 );
// ------------------------------------------------------------
// ARGB カラー(32bit)を取得する
// ------------------------------------------------------------
var color_argb0:uint = bmp_data.getPixel32( 0 , 0 );
var color_argb1:uint = bmp_data.getPixel32( 1 , 5 );
var color_argb2:uint = bmp_data.getPixel32( 20 , 10 );
// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
trace( color_rgb0.toString(16) ); // 00001122
trace( color_rgb1.toString(16) ); // 00aabbcc
trace( color_rgb2.toString(16) ); // 00ff8700
trace( color_argb0.toString(16) ); // ff001122
trace( color_argb1.toString(16) ); // ffaabbcc
trace( color_argb2.toString(16) ); // 20ff8700
■ビットマップにピクセルカラーをまとめて書き込む
■ ByteArray 型でまとめて書き込む
setPixels() メソッドを使用します。
ByteArray オブジェクトには、ARGBカラー(32bit)を、順番に格納します。
透過なしビットマップの場合でも、アルファ値は含めます。
(透過|赤|緑|青) | (透過|赤|緑|青) | (透過|赤|緑|青) ...
指定した色が、実際に書き込まれるとは限りません。
アルファ値によって、赤緑青は丸められます。
BitmapData.setPixels( Rectangle , ByteArray ) :void
第01引数 | Rectangle | 書き込む範囲を Rectangle 型で指定 |
第02引数 | uint | ByteArray 型のデータを指定。 ARGBカラー(32bit)の連続したデータ |
戻り値 | void | なし |
ピクセルカラーをまとめて書き込む(ByteArray 型を指定)
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Rectangle;
import flash.utils.ByteArray;
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0xFFE0E0E0 );
// ------------------------------------------------------------
// 書き込む句形範囲
// ------------------------------------------------------------
var rect:Rectangle = new Rectangle(10 , 10 , 100 , 50);
// ------------------------------------------------------------
// ByteArray オブジェクトを作成
// ------------------------------------------------------------
var byte_array:ByteArray = new ByteArray();
// ------------------------------------------------------------
// 適当な色をセット
// ------------------------------------------------------------
byte_array.position = 0;
var i:int;
var num:int = rect.width * rect.height;
for(i=0;i < num;i++){
var a:uint = Math.floor(Math.random() * 0xff);
var r:uint = Math.floor(Math.random() * 0xff);
var g:uint = Math.floor(Math.random() * 0xff);
var b:uint = Math.floor(Math.random() * 0xff);
var color_argb:uint = (a << 24) | (r << 16) | (g << 8) | (b << 0);
byte_array.writeUnsignedInt(color_argb);
}
// ------------------------------------------------------------
// ByteArray 型でまとめて書き込む
// ------------------------------------------------------------
byte_array.position = 0;
bmp_data.setPixels( rect , byte_array );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
■ Vector 型でまとめて書き込む (Flash 10 以降)
setVector() メソッドを使用します。
Vector オブジェクトのベース型は、uint です。
ARGBカラー(32bit)を、順番に格納します。
指定した色が、実際に書き込まれるとは限りません。
アルファ値によって、赤緑青は丸められます。
BitmapData.setVector( Rectangle , Vector.<uint> ) :void
第01引数 | Rectangle | 取得したい範囲を Rectangle 型で指定 |
第02引数 | Vector.<uint> | Vector オブジェクトを指定。ARGBカラー(uint)の連続したデータ |
戻り値 | void | なし |
ピクセルカラーをまとめて書き込む(Vector 型を指定)
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Rectangle;
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0xFFE0E0E0 );
// ------------------------------------------------------------
// 書き込む句形範囲
// ------------------------------------------------------------
var rect:Rectangle = new Rectangle(10 , 10 , 100 , 50);
var num:int = rect.width * rect.height;
// ------------------------------------------------------------
// Vector オブジェクトを作成
// ------------------------------------------------------------
var vector:Vector.<uint> = new Vector.<uint>(num);
// ------------------------------------------------------------
// 適当な色をセット
// ------------------------------------------------------------
var i:int;
for(i=0;i < num;i++){
var a:uint = Math.floor(Math.random() * 0xff);
var r:uint = Math.floor(Math.random() * 0xff);
var g:uint = Math.floor(Math.random() * 0xff);
var b:uint = Math.floor(Math.random() * 0xff);
var color_argb:uint = (a << 24) | (r << 16) | (g << 8) | (b << 0);
vector[i] = color_argb;
}
// ------------------------------------------------------------
// Vector 型でまとめて書き込む
// ------------------------------------------------------------
bmp_data.setVector( rect , vector );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
■ビットマップを塗りつぶす(矩形指定)
fillRect() メソッドを使用します。
指定した色が、実際に書き込まれるとは限りません。
アルファ値によって、赤緑青は丸められます。
BitmapData.fillRect( 矩形 , color ) :void
第01引数 | Rectangle | 描画する矩形範囲を指定(小数の指定は不可) |
第02引数 | uint | ARGB カラー値を指定する |
戻り値 | void | なし |
■使用例
矩形指定で、ビットマップを塗りつぶす
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Rectangle;
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0xFFE0E0FF );
// ------------------------------------------------------------
// 各カラーを用意
// ------------------------------------------------------------
var a:uint = 255;
var r:uint = 255;
var g:uint = 192;
var b:uint = 128;
// ------------------------------------------------------------
// 各カラーから ARGB 値を計算
// ------------------------------------------------------------
var color_argb:uint = (a << 24) | (r << 16) | (g << 8) | (b << 0);
// ------------------------------------------------------------
// Rectangle オブジェクトを作成
// ------------------------------------------------------------
var rect:Rectangle = new Rectangle( 10 , 10 , 200 , 100 );
// ------------------------------------------------------------
// ビットマップを塗りつぶす(矩形指定)
// ------------------------------------------------------------
bmp_data.fillRect( rect , color_argb );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
■ビットマップを塗りつぶす(塗りつぶしツール方式)
floodFill() メソッドを使用します。
指定した色が、実際に書き込まれるとは限りません。
アルファ値によって、赤緑青は丸められます。
BitmapData.floodFill( x , y , color ) :void
第01引数 | int | 水平方向のピクセル位置 |
第02引数 | int | 垂直方向のピクセル位置 |
第03引数 | uint | ARGB カラー値を指定する |
戻り値 | void | なし |
■使用例
ビットマップを、塗りつぶしツール方式で塗りつぶす
import flash.display.BitmapData;
import flash.display.Bitmap;
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0xFFE0E0FF );
// ------------------------------------------------------------
// 各カラーを用意
// ------------------------------------------------------------
var a:uint = 255;
var r:uint = 255;
var g:uint = 192;
var b:uint = 128;
// ------------------------------------------------------------
// 各カラーから ARGB 値を計算
// ------------------------------------------------------------
var color_argb:uint = (a << 24) | (r << 16) | (g << 8) | (b << 0);
// ------------------------------------------------------------
// ビットマップを塗りつぶす(塗りつぶしツール方式)
// ------------------------------------------------------------
bmp_data.floodFill( 1 , 1 , color_argb );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
■指定カラーをすべて含む、矩形サイズを取得する
getColorBoundsRect() メソッドを使用します。
BitmapData.getColorBoundsRect( mask , color , findColor ) :Rectangle
第01引数 | uint | マスク値を指定(すべてのピクセルカラーと論理積される) |
第02引数 | uint | ARGB カラーを指定 |
第03引数(略可) | Boolean | true の場合「指定カラー」をすべて検索(デフォルト) false の場合「指定カラー以外」をすべて検索 |
戻り値 | Rectangle | なし |
■第01引数 (マスク)
ここで指定した値は、すべてのピクセルカラーと論理積されます。
ARGB カラーのうち、無視したい領域のビットを 0 とします。
例えば、すべてのカラーを考慮したい場合、0xFFFFFFFF を指定します。
例えば、(透過,緑)のみを考慮したい場合、0xFF00FF00 を指定します。
透過成分のマスクは機能しない?ようです。 0xFF000000 は必ず指定します。
■第02引数 (ARGB カラー)
ARGB カラーを指定します。
第01引数で 0 を指定したビット位置は、第02引数でも 0 で埋めます。
指定した色で、実際に検索されるとは限りません。
アルファ値によって、赤緑青は丸められます。
■第03引数(findColor)
「(ピクセルカラー) & (第01引数)」と「第02引数」が等しいか、比較されます。
true で、「条件を満たすピクセル」をすべて検索します。
false で、「条件を満みたさないピクセル」をすべて検索します。
デフォルトは、true です。
■使用例
指定カラーをすべて含む、矩形サイズを取得する
import flash.display.BitmapData;
import flash.geom.Rectangle;
// ------------------------------------------------------------
// ARGB 値を用意
// ------------------------------------------------------------
var color_argb0:uint = 0xFF998877;
var color_argb1:uint = 0xff112233;
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new flash.display.BitmapData( 512 , 512 , true , color_argb0 );
// ------------------------------------------------------------
// 適当な位置にピクセルカラーを書き込む
// ------------------------------------------------------------
bmp_data.setPixel32( 40 , 150 , color_argb1 );
bmp_data.setPixel32( 200 , 60 , color_argb1 );
bmp_data.setPixel32( 420 , 220 , color_argb1 );
// ------------------------------------------------------------
// マスクを用意(ここでは青色成分を無視)
// ------------------------------------------------------------
var mask:uint = 0xFFFFFF00;
// ------------------------------------------------------------
// 「指定カラー」をすべて含む、矩形サイズを取得する
// ------------------------------------------------------------
var rect0:Rectangle = bmp_data.getColorBoundsRect( mask , (color_argb1 & mask) );
// 出力テスト
trace(rect0); // x:40 , y:60 , w:381 , h:161
// ------------------------------------------------------------
// 「指定カラー以外」をすべて含む、矩形サイズを取得する
// ------------------------------------------------------------
var rect1:Rectangle = bmp_data.getColorBoundsRect( mask , (color_argb0 & mask) , false );
// 出力テスト
trace(rect1); // x:40 , y:60 , w:381 , h:161
■ビットマップとの当たり判定について
■ビットマップとの当たり判定
hitTest() メソッドを使用します。
BitmapData.hitTest( firstPoint , firstAlphaThreshold , secondObject , secondBitmapPoint , secondAlphaThreshold ) :Boolean
第01引数 | Point | 自身のビットマップの位置を指定 |
第02引数 | Number | 自身のビットマップにて、有とみなす透過成分のしきい値を指定(0 ~ 255) |
第03引数 | * | 相手のソースを指定。Point、Rectangle、BitmapData 型の指定が可能 |
第04引数(略可) | Point | 相手のビットマップの位置を指定 |
第05引数(略可) | Number | 相手のビットマップにて、有とみなす透過成分のしきい値を指定(0 ~ 255) |
戻り値 | Boolean | 当たっていれば true、当たっていなければ false が得られる |
■第01引数 (自身のビットマップの位置)
自身のビットマップの位置を、Point 型で指定します。
当たり判定を調べる為の、仮想的な座標系に配置されます。
■第03引数(相手のソース)
相手のソースを指定します。
座標との当たり判定を調べるには、Point 型を指定します。
矩形との当たり判定を調べるには、Rectangle 型を指定します。
ビットマップとの当たり判定を調べるには、BitmapData 型を指定します。
この場合、第04~05引数も設定します。
■第04引数 (相手のビットマップの位置)
相手のビットマップの位置を、Point 型で指定します。
第03引数に、BitmapData 型を指定した場合に効果があります。
■使用例
2つのビットマップの当たり判定を調べる
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.events.Event;
// ------------------------------------------------------------
// 埋め込んだ画像ファイルから、BitmapData オブジェクトを作成する (自作クラス "MyBitmapData0" )
// ------------------------------------------------------------
var bmp_data:BitmapData = new MyBitmapData0( 0 , 0 );
// ------------------------------------------------------------
// 埋め込んだ画像ファイルから、BitmapData オブジェクトを作成する (自作クラス "MyBitmapData1" )
// ------------------------------------------------------------
var second_obj:BitmapData = new MyBitmapData1( 0 , 0 );
// ------------------------------------------------------------
// Bitmap オブジェクトを作成
// ------------------------------------------------------------
var bitmap_obj0:Bitmap = new Bitmap( bmp_data );
var bitmap_obj1:Bitmap = new Bitmap( second_obj );
stage.addChild( bitmap_obj0 );
stage.addChild( bitmap_obj1 );
// ------------------------------------------------------------
// 毎フレーム実行されるイベント
// ------------------------------------------------------------
stage.addEventListener(Event.ENTER_FRAME , function (e:Event):void{
// ------------------------------------------------------------
// 当たり判定用パラメータ
// ------------------------------------------------------------
// 自身のビットマップの位置
var first_pos:Point = new Point( 200 , 200 );
// 相手のビットマップの位置
var second_pos:Point = new Point( stage.mouseX , stage.mouseY );
// ------------------------------------------------------------
// 2つのビットマップの当たり判定を調べる
// ------------------------------------------------------------
var result:Boolean = bmp_data.hitTest( first_pos , 255 , second_obj , second_pos , 255 );
if(result){
trace("当たりあり");
}else{
trace("当たりなし");
}
// ------------------------------------------------------------
// ムービークリップを移動
// ------------------------------------------------------------
bitmap_obj0.x = first_pos.x;
bitmap_obj0.y = first_pos.y;
bitmap_obj1.x = second_pos.x;
bitmap_obj1.y = second_pos.y;
});
■2つのビットマップを比較する
compare() メソッドを使用します。
2つのビットマップの大きさは、一致している必要があります。
BitmapData.compare( otherBitmapData ) :Object
第01引数 | BitmapData | 相手の BitmapData オブジェクトを指定 |
戻り値 | Object | 一致していれば 0、エラーなら負数、 差異が存在する場合は、新しい BitmapData オブジェクトが得られる。 |
■戻り値 (負数が得られた場合)
戻り値から負数が得られた場合、エラーが発生しています。
数値 | 解説 |
-3 | 2つのビットマップの幅が一致していない |
-4 | 2つのビットマップの高さが一致していない |
■戻り値 ( 0 が得られた場合)
戻り値から 0 が得られた場合、2つのビットマップは一致しています。
■戻り値 (BitmapData が得られた場合)
差異が存在する場合、新しい BitmapData が得られます。
新しいビットマップのピクセルカラーは、以下の通りです。
(新しいカラー) = (自身のカラー) - (相手のカラー)
カラーチャンネルごとに、減算されます。
アルファ成分は、必ず 255 となるようです。
■使用例
2つのビットマップを比較した結果を取得する
import flash.display.BitmapData;
import flash.display.Bitmap;
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0xFF224466 );
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data_other:BitmapData = new BitmapData( 512 , 512 , true , 0xFF101010 );
// ------------------------------------------------------------
// 2つの BitmapData オブジェクトを比較する
// ------------------------------------------------------------
var result:* = bmp_data.compare( bmp_data_other );
// 出力テスト
trace(result);
// ------------------------------------------------------------
// 一致しているか調べる
// ------------------------------------------------------------
var equal:Boolean = (result === 0);
// 出力テスト
trace(equal); // false
// ------------------------------------------------------------
// 差分 BitmapData が存在するか調べる
// ------------------------------------------------------------
var bmp_data_diff:BitmapData = result as BitmapData;
if(bmp_data_diff){
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data_diff);
stage.addChild( bitmap_obj );
// 出力テスト
trace( bmp_data_diff.getPixel32(0,0).toString(16) ); // ff123456
}
■ビットマップのヒストグラムを取得する (Flash 10 以降)
histogram() メソッドを使用します。
ヒストグラムは、カラーチャンネルごとに出力されます。
BitmapData.histogram( Rectangle ) :Vector.<Vector.<Number>>
第01引数(略可) | Rectangle | 取得したい矩形範囲を、Rectangle 型で指定。省略した場合は全体 |
戻り値 | Vector.<Vector.<Number>> | ヒストグラムのリストが得られる |
■戻り値 (ヒストグラムのリスト)
戻り値から、Vector 型のオブジェクトが得られます。
ベース型は、Vector.<Number> です。
中には、4つの Vector オブジェクトが格納されています。
中身は、カラーチャンネルごとの、ヒストグラムデータです。
番地 | 解説 |
0 | 赤チャンネルのヒストグラムデータ |
1 | 緑チャンネルのヒストグラムデータ |
2 | 青チャンネルのヒストグラムデータ |
3 | 透過チャンネルのヒストグラムデータ |
■ヒストグラムデータについて
Vector 型のオブジェクトが得られます。
ベース型は、Number です。
0 ~ 255 番地までに、各カラー値の使用総数が格納されています。
■使用例
ビットマップのヒストグラムを調べる
import flash.display.BitmapData;
import flash.display.Bitmap;
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 4 , 4 , true , 0xFF010203 );
// ------------------------------------------------------------
// ビットマップのヒストグラムを取得する
// ------------------------------------------------------------
var histogram_list:Vector.<Vector.<Number>> = bmp_data.histogram();
// ------------------------------------------------------------
// 各チャンネルごとのヒストグラムデータ
// ------------------------------------------------------------
var histogram_r:Vector.<Number> = histogram_list[0];
var histogram_g:Vector.<Number> = histogram_list[1];
var histogram_b:Vector.<Number> = histogram_list[2];
var histogram_a:Vector.<Number> = histogram_list[3];
// ------------------------------------------------------------
// 出力テスト
// ------------------------------------------------------------
trace(histogram_r); // [ 0 , 16 , 0 , 0 , 0 ...
trace(histogram_g); // [ 0 , 0 , 16 , 0 , 0 ...
trace(histogram_b); // [ 0 , 0 , 0 , 16 , 0 ...
trace(histogram_a); // [ 0 , 0 , 0 , 0 , 0 ...
■ビットマップのロック機能について
BitmapData の書き込み関連のメソッドを呼び出すと、参照しているすべてのオブジェクトも連動して更新されます。
書込編集のパフォーマンスを向上させるには、ロック機能を使用します。
1.ビットマップのロックを開始する
lock() メソッドを使用します。
BitmapData.lock( ) :void
引数 | void | なし |
戻り値 | void | なし |
2.ロック中に、ビットマップを書込編集する
setPixel32() などの、書き込み関連のメソッドを実行します。
3.ビットマップのロックを終了する
unlock() メソッドを使用します。
BitmapData.unlock( changeRect ) :void
第01引数(略可) | Rectangle | 変更を行った範囲をシステムに通知する。省略した場合、全体を更新したと通知する |
戻り値 | void | なし |
■使用例
ビットマップのロック中に書き込み編集する
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Rectangle;
import flash.utils.ByteArray;
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0xFFFFFFFF );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
// ------------------------------------------------------------
// BitmapData のロックを開始する
// ------------------------------------------------------------
bmp_data.lock();
// ------------------------------------------------------------
// BitmapData を書込編集する
// ------------------------------------------------------------
var x:int;
var y:int;
var w:int = bmp_data.width;
var h:int = bmp_data.height;
for(y=0;y < h;y++){
for(x=0;x < w;x++){
bmp_data.setPixel( x , y , Math.floor(Math.random() * 0xFFFFFF) );
}
}
// ------------------------------------------------------------
// BitmapData のロックを終了する
// ------------------------------------------------------------
bmp_data.unlock();
■ピクセルカラーの品質について
ピクセルカラーが正確である場合
アルファ成分が、255 (0xff) である場合、残りの赤緑青は、正確です。
ピクセルカラーが正確ではない場合
アルファ成分が、255 (0xff) ではない場合、残りの赤緑青は、不正確です。
埋め込み画像に透明な部分が存在する場合、そのピクセルカラーは不正確です。
書き込んだピクセルが透明である場合、実際に設定されるカラーは不正確です。
copyChannel() メソッドなどを使っても、回避できないようです。
アルファ成分と指定色の関係
アルファ値によって、残りの赤緑青は、丸められます。
アルファ値が 0 に近いほど、大きく変化します。
例えば、アルファ値が 8 だった場合、9 段階の近似値となります。
0 , 32 , 64 , 96 , 127 , 159 , 191 , 223 , 255
例えば、アルファ値が 4 だった場合、5 段階の近似値となります。
0 , 64 , 127 , 191 , 255
丸めの近似式は、以下の通りです。
丸めの近似式
if( (アルファ値) == 0 ){
(書込色) = 0;
}else{
var g = 255 / (アルファ値);
(書込色) = Math.round((指定色) / g) * g;
}
ビットマップの転送について
BitmapData オブジェクトを複製する
clone() メソッドを使用します。
BitmapData.clone ( ) :BitmapData
引数 | void | なし |
戻り値 | BitmapData | 新しい BitmapData オブジェクトが得られる |
■使用例
BitmapData オブジェクトを複製する
import flash.display.BitmapData;
import flash.display.Bitmap;
// ------------------------------------------------------------
// BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 256 , 256 , true , 0xffcc8800 );
// ------------------------------------------------------------
// BitmapData オブジェクトを複製する
// ------------------------------------------------------------
var bmp_data_clone:BitmapData = bmp_data.clone();
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
イメージを高速コピーする(ピクセルカラー)
copyPixels() メソッドを使用します。
コピー元の素材を、ソースといいます。
実際に書き込まれるコピー先を、ターゲットといいます。
BitmapData.copyPixels( ソース , ソース矩形 , ターゲット側の座標 , アルファソース , アルファソース座標 , アルファブレンド? ) :void
第01引数 | BitmapData | ソースを指定 |
第02引数 | Rectangle | ソースの矩形範囲を、Rectangle 型で指定 |
第03引数 | Point | ターゲット側の配置座標を、Point 型で指定 |
第04引数(略可) | BitmapData | 2枚目のソースを指定、アルファ成分のみ作用する(第01ソースと乗算される) |
第05引数(略可) | Point | 2枚目のソースの矩形範囲を、Point 型で指定(幅と高さは第02引数を継承) |
第06引数(略可) | Boolean | true なら元の絵とアルファブレンド、false なら単純に書き潰し、デフォルトは false |
戻り値 | void | なし |
■第01引数 (ソース)
ソースとなる、BitmapData オブジェクトを指定します。
「ターゲット」と「ソース」に、同一の BitmapData 指定も可能です。
■第02引数 (ソース側の矩形範囲)
ソース側の矩形範囲を、Rectangle 型で指定します。
この幅と高さは、第05引数にも作用します。
■第04引数 (アルファソース)
2枚目のソースとなる、BitmapData オブジェクトを指定します。
アルファ成分のみが使用されます。
「第01ソース」と「アルファソース」は、乗算されます。
結果は、「新しいソース」となります。
第01ソース | 第02ソース | 結果ソース |
null を指定して、省略する事もできます。
第01ソース | 第02ソース | 結果ソース |
■第06引数 アルファブレンド
true を指定した場合、元の絵をソースと合成します。
「ターゲット」と「ソース」とで、アルファブレンドします。
false を指定した場合、ソースで単純に書き潰します。
ターゲットの元の絵は、考慮されず、消滅します。
デフォルトは、false です。
ターゲットが、透過なし(24bit)である場合、必ず true で動作します。
■単純な書き潰し例
ピクセルカラーを高速コピーする
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Point;
import flash.geom.Rectangle;
// ------------------------------------------------------------
// ターゲット用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0xffe0e0e0 );
// ------------------------------------------------------------
// ソース用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var source:BitmapData = new BitmapData( 256 , 256 , true , 0xffcc8800 );
// ------------------------------------------------------------
// コピー用パラメータ
// ------------------------------------------------------------
// ソースの矩形範囲
var source_rect:Rectangle = new Rectangle( 50 , 50 , 256 , 128 );
// ターゲットの位置
var target_pos:Point = new Point( 20 , 20 );
// ------------------------------------------------------------
// ピクセルカラーを高速コピーする
// ------------------------------------------------------------
bmp_data.copyPixels( source , source_rect , target_pos );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
■アルファソース付きの使用例
ソースとアルファソースを指定して、ピクセルカラーを高速コピーする
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.display.Shape;
import flash.display.Graphics;
import flash.display.GradientType;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.geom.Matrix;
// ------------------------------------------------------------
// ターゲット用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0xffc0c0ff );
// ------------------------------------------------------------
// ソース用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var source0:BitmapData = new BitmapData( 256 , 256 , true , 0xffaa6600 );
// ------------------------------------------------------------
// アルファソース用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var source1:BitmapData = (function():BitmapData{
// Shape オブジェクトを作成
var shape:Shape = new Shape();
// Shape に矩形を描画
var g:Graphics = shape.graphics;
var mtx:Matrix = new Matrix(256/1638.4,0,0,1,128,0);
g.beginGradientFill ( GradientType.LINEAR , [0x000000,0x000000] , [0.0,1.0] , [0,255] , mtx );
g.moveTo ( 0 , 0 );
g.lineTo ( 0 , 256 );
g.lineTo ( 256 , 256 );
g.lineTo ( 256 , 0 );
g.endFill();
// BitmapData オブジェクトを作成する(32bit)
var bmp_data1:BitmapData = new BitmapData( 256 , 256 , true , 0x00000000 );
// ビットマップに Shape を描画
bmp_data1.draw(shape);
return bmp_data1;
})();
// ------------------------------------------------------------
// コピー用パラメータ
// ------------------------------------------------------------
// ソースの矩形範囲
var source_rect:Rectangle = new Rectangle( 50 , 50 , 256 , 128 );
// ターゲットの位置
var target_pos:Point = new Point( 20 , 20 );
// アルファソースの位置
var alpha_pos:Point = new Point( 0 , 0 );
// ------------------------------------------------------------
// ピクセルカラーを高速コピーする
// ------------------------------------------------------------
bmp_data.copyPixels( source0 , source_rect , target_pos , source1 , alpha_pos , true );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
イメージを高速コピーする(カラーチャンネル単位)
copyChannel() メソッドを使用します。
コピー元の素材を、ソースといいます。
実際に書き込まれるコピー先を、ターゲットといいます。
BitmapData.copyChannel( ソース , ソース矩形 , ターゲット側の座標 , ソース側カラーチャンネル , ターゲット側カラーチャンネル ) :void
第01引数 | BitmapData | ソースを指定 |
第02引数 | Rectangle | ソースの矩形範囲を、Rectangle 型で指定 |
第03引数 | Point | ターゲット側の配置座標を、Point 型で指定 |
第04引数 | uint | ソース側のカラーチャンネルを指定(BitmapDataChannel.*) |
第05引数 | uint | ターゲット側のカラーチャンネルを指定(BitmapDataChannel.*) |
戻り値 | void | なし |
■第01引数 (ソース)
ソースとなる、BitmapData オブジェクトを指定します。
「ターゲット」と「ソース」に、同一の BitmapData 指定も可能です。
■第04引数 (ソース側カラーチャンネル)
ソース側のカラーチャンネルを指定します。
定数 | 数値 | 解説 |
BitmapDataChannel.RED | 1 | 赤色チャンネル |
BitmapDataChannel.GREEN | 2 | 緑色チャンネル |
BitmapDataChannel.BLUE | 4 | 青色チャンネル |
BitmapDataChannel.ALPHA | 8 | 透過チャンネル |
■第05引数 (ターゲット側カラーチャンネル)
ターゲット側のカラーチャンネルを指定します。
定数 | 数値 | 解説 |
BitmapDataChannel.RED | 1 | 赤色チャンネル |
BitmapDataChannel.GREEN | 2 | 緑色チャンネル |
BitmapDataChannel.BLUE | 4 | 青色チャンネル |
BitmapDataChannel.ALPHA | 8 | 透過チャンネル |
指定したカラーチャンネルだけが変化するとは限りません。
アルファ値によって、赤緑青は丸められます。
■使用例
カラーチャンネル単位で高速コピーする
import flash.display.BitmapData;
import flash.display.BitmapDataChannel;
import flash.display.BitmapData;
import flash.geom.Point;
import flash.geom.Rectangle;
// ------------------------------------------------------------
// ターゲット用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0xffe0e0e0 );
// ------------------------------------------------------------
// ソース用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var source:BitmapData = new BitmapData( 256 , 256 , true , 0xffef8912 );
// ------------------------------------------------------------
// コピー用パラメータ
// ------------------------------------------------------------
// ソースの矩形範囲
var source_rect:Rectangle = new Rectangle( 50 , 50 , 256 , 128 );
// ターゲットの位置
var target_pos:Point = new Point( 20 , 20 );
// ------------------------------------------------------------
// カラーチャンネル単位で高速コピーする
// ------------------------------------------------------------
bmp_data.copyChannel( source , source_rect , target_pos , BitmapDataChannel.RED , BitmapDataChannel.GREEN ); // 赤を緑チャンネルへ
bmp_data.copyChannel( source , source_rect , target_pos , BitmapDataChannel.GREEN , BitmapDataChannel.BLUE ); // 緑を青チャンネルへ
bmp_data.copyChannel( source , source_rect , target_pos , BitmapDataChannel.BLUE , BitmapDataChannel.RED ); // 青を赤チャンネルへ
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
// 出力テスト
trace( bmp_data.getPixel(20,20).toString(16) ); // 12ef89
イメージをスクロールする
scroll() メソッドを使用します。
copyPixels() メソッドを使用した方が、より高度に制御できます。
BitmapData.scroll( x , y ) :void
第01引数 | int | 水平方向の移動量 |
第02引数 | int | 垂直方向の移動量 |
戻り値 | void | なし |
■スクロールの動作について
イメージ全体を、ドット単位で移動して、書き潰します。
移動して画面外に消えた領域は、失われます。
■使用例
ビットマップをスクロールする
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.events.Event;
// ------------------------------------------------------------
// 埋め込んだ画像ファイルから、BitmapData オブジェクトを作成する (自作クラス "MyBitmapData" )
// ------------------------------------------------------------
var bmp_data:BitmapData = new MyBitmapData( 0 , 0 );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
// ------------------------------------------------------------
// 毎フレーム実行されるイベント
// ------------------------------------------------------------
stage.addEventListener(Event.ENTER_FRAME , function (e:Event):void{
// ビットマップをスクロールする
bmp_data.scroll(2,1);
});
イメージをマージする
サンプルをダウンロード
■2つのイメージをマージする
■マージ処理について
2つのビットマップデータを用意します。
素材用のビットマップを、ソースといいます。
編集されるビットマップを、ターゲットといいます。
ターゲット | ソース |
ターゲットの、元のイメージは重要です。
「ソース」と「ターゲット」のピクセルカラーが、融合されます。
結果は、ターゲットに反映されます。(破壊編集)
カラーチャンネルごとに、融合比率を指定できます。
ターゲット | ソース |
■イメージをマージする
merge() メソッドを使用します。
BitmapData.merge( ソース , ソース矩形 , ターゲット側の座標 , 赤融合比率 , 緑融合比率 , 青融合比率 , 透過融合比率 ) :void
第01引数 | BitmapData | ソースを指定 |
第02引数 | Rectangle | ソースの矩形範囲を、Rectangle 型で指定 |
第03引数 | Point | ターゲット側の配置座標を、Point 型で指定 |
第04引数 | uint | 赤チャンネルの融合比率 (0~255) |
第05引数 | uint | 緑チャンネルの融合比率 (0~255) |
第06引数 | uint | 青チャンネルの融合比率 (0~255) |
第07引数 | uint | 透過チャンネルの融合比率 (0~255) |
戻り値 | void | なし |
■第01引数 (ソース)
ソースとなる、BitmapData オブジェクトを指定します。
■第04~07引数 (融合比率)
0 ~ 255 の数値を指定します。
0 に近いほど、ターゲットに近くなります。
255 に近いほど、ソースに近くなります。
融合式
var d = (ソース色) - (ターゲット色);
var m = (引数値) / 255.0;
(新しい色) = (ターゲット色) + (d * m);
■使用例
2つのイメージをマージする
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Point;
import flash.geom.Rectangle;
// ------------------------------------------------------------
// ターゲット用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0xffffb800 );
// ------------------------------------------------------------
// ソース用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var source:BitmapData = new BitmapData( 256 , 256 , true , 0xff0047ff );
// ------------------------------------------------------------
// マージ用パラメータ
// ------------------------------------------------------------
// ソースの矩形範囲
var source_rect:Rectangle = new Rectangle( 50 , 50 , 256 , 128 );
// ターゲットの位置
var target_pos:Point = new Point( 20 , 20 );
// ------------------------------------------------------------
// イメージをマージする
// ------------------------------------------------------------
bmp_data.merge( source , source_rect , target_pos , 128 , 128 , 128 , 128 );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
// 出力テスト
trace( bmp_data.getPixel(20,20).toString(16) ); // 7f7f7f
イメージのパレットマップについて
■パレットマップを使って、イメージをコピーする
paletteMap() メソッドを使用します。
コピー元の素材を、ソースといいます。
実際に書き込まれるコピー先を、ターゲットといいます。
BitmapData.paletteMap( ソース , ソース矩形 , ターゲット側の座標 , 赤パレットマップ , 緑パレットマップ , 青パレットマップ , 透過パレットマップ ) :void
第01引数 | BitmapData | ソースを指定 |
第02引数 | Rectangle | ソースの矩形範囲を、Rectangle 型で指定 |
第03引数 | Point | ターゲット側の配置座標を、Point 型で指定 |
第04引数(略可) | Array | 赤チャンネル用のパレットマップ |
第05引数(略可) | Array | 緑チャンネル用のパレットマップ |
第06引数(略可) | Array | 青チャンネル用のパレットマップ |
第07引数(略可) | Array | 透過チャンネル用のパレットマップ |
戻り値 | void | なし |
■第01引数 (ソース)
ソースとなる、BitmapData オブジェクトを指定します。
「ターゲット」と「ソース」に、同一の BitmapData 指定も可能です。
■第04~07引数 (パレットマップ)
色をマッピング変換したい場合は、パレットマップを指定します。
無視したい場合は、null をセットします。
■パレットマップについて
配列を作成して、0 から 255 番地までに、加算値をセットします。
任意のピクセルは、自身の色 (0 ~ 255) を使って、パレットマップの番地に格納されている、加算値を参照します。
この加算値は、32ビットカラー(ARGB)を指定します。
自身のチャンネルだけでなく、他のチャンネルにも影響します。
■基礎値について
パレットマップを指定したチャンネルは、0 が基礎値です。
無視したチャンネルは、元の色(0 ~ 255)が基礎値です。
例えば、0xffaabbcc 色があるとします。
(赤、青、透過)を無視している場合、基礎値は 0xffaa00cc です。
(緑、透過)を無視している場合、基礎値は 0xff00bb00 です。
■出力ピクセルカラーについて
基礎値に対して、すべての加算値が足し込まれます。
この合計値が、出力ピクセルカラーとなります。
加算値は、最大で4回マッチする可能性があります。(赤、緑、青、透過)
クランプ処理はありません。単純に32bit整数として、加算されます。
桁の繰り上がりや、繰り下がりが発生すると、色は一周します。
同色は、絶対値指定であり、安全に動作します。
異色は、相対値指定であり、色が一周するリスクがあります。
■パレットマップの作成例
変化しない、デフォルトのパレットマップ
// ------------------------------------------------------------
// パレットマップ用の配列を作成する
// ------------------------------------------------------------
var map_a:Array = new Array(); // 透過チャンネル用のパレットマップ
var map_r:Array = new Array(); // 赤チャンネル用のパレットマップ
var map_g:Array = new Array(); // 緑チャンネル用のパレットマップ
var map_b:Array = new Array(); // 青チャンネル用のパレットマップ
// ------------------------------------------------------------
// パレットマップを初期化する
// ------------------------------------------------------------
var i:uint;
for(i=0;i < 256;i++){
map_a[i] = (i << 24);
map_r[i] = (i << 16);
map_g[i] = (i << 8);
map_b[i] = (i << 0);
}
ネガ反転するパレットマップ
// ------------------------------------------------------------
// パレットマップ用の配列を作成する
// ------------------------------------------------------------
var map_a:Array = new Array(); // 透過チャンネル用のパレットマップ
var map_r:Array = new Array(); // 赤チャンネル用のパレットマップ
var map_g:Array = new Array(); // 緑チャンネル用のパレットマップ
var map_b:Array = new Array(); // 青チャンネル用のパレットマップ
// ------------------------------------------------------------
// パレットマップを初期化する
// ------------------------------------------------------------
var i:uint;
for(i=0;i < 256;i++){
map_a[i] = (( i) << 24);
map_r[i] = ((256 - i) << 16);
map_g[i] = ((256 - i) << 8);
map_b[i] = ((256 - i) << 0);
}
加算作用するデータを埋め込む例
// ------------------------------------------------------------
// パレットマップ用の配列を作成する
// ------------------------------------------------------------
var map_a:Array = new Array(); // 透過チャンネル用のパレットマップ
var map_r:Array = new Array(); // 赤チャンネル用のパレットマップ
var map_g:Array = new Array(); // 緑チャンネル用のパレットマップ
var map_b:Array = new Array(); // 青チャンネル用のパレットマップ
// ------------------------------------------------------------
// パレットマップをデフォルト値で初期化する
// ------------------------------------------------------------
var i:uint;
for(i=0;i < 256;i++){
map_a[i] = (i << 24);
map_r[i] = (i << 16);
map_g[i] = (i << 8);
map_b[i] = (i << 0);
}
// ------------------------------------------------------------
// 赤が 0x80 である場合、赤(+1) 緑(-2) 青(-3) を加算する
// ------------------------------------------------------------
map_r[0x80] += ((1) << 16) + ((-2) << 8) + ((-3) << 0);
// ------------------------------------------------------------
// 青が 0xc0 である場合、赤(-4) 緑(+5) 青(-6) を加算する
// ------------------------------------------------------------
map_b[0xc0] += ((-4) << 16) + ((5) << 8) + ((-6) << 0);
■使用例
パレットマップを使って、イメージをコピーする
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Point;
import flash.geom.Rectangle;
// ------------------------------------------------------------
// ターゲット用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0x00000000 );
// ------------------------------------------------------------
// ソース用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var source:BitmapData = new BitmapData( 256 , 256 , true , 0xffa8b8c8 );
// ------------------------------------------------------------
// パレットマップ用パラメータ
// ------------------------------------------------------------
// ソースの矩形範囲
var source_rect:Rectangle = new Rectangle( 50 , 50 , 256 , 128 );
// ターゲットの位置
var target_pos:Point = new Point( 20 , 20 );
// ------------------------------------------------------------
// デフォルトのパレットマップを用意する
// ------------------------------------------------------------
var map_a:Array = new Array();
var map_r:Array = new Array();
var map_g:Array = new Array();
var map_b:Array = new Array();
var i:uint;
for(i=0;i < 256;i++){
map_a[i] = (i << 24);
map_r[i] = (i << 16);
map_g[i] = (i << 8);
map_b[i] = (i << 0);
}
// ------------------------------------------------------------
// 赤が 0xa8 である場合、赤(+2) 緑(-3) 青(-5) を加算する
// ------------------------------------------------------------
map_r[0xa8] += ((2) << 16) + ((-3) << 8) + ((-5) << 0);
// ------------------------------------------------------------
// パレットマップを使って、イメージをコピーする
// ------------------------------------------------------------
bmp_data.paletteMap( source , source_rect , target_pos , map_r , map_g , map_b , map_a );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
// 出力テスト
trace( bmp_data.getPixel(20,20).toString(16) ); // aab5c3
イメージのスレッショルドについて
■しきい値を使って、イメージを転送する
threshold() メソッドを使用します。
調査したいビットマップを、ソースといいます。
比較結果を書き込むビットマップを、ターゲットといいます。
BitmapData.threshold( ソース , ソース矩形 , ターゲット側の座標 , "比較演算子" , しきい値 , カラー値 , マスク値 , copySource? ) :Number
第01引数 | BitmapData | ソースを指定 |
第02引数 | Rectangle | ソースの矩形範囲を、Rectangle 型で指定 |
第03引数 | Point | ターゲット側の配置座標を、Point 型で指定 |
第04引数 | String | 比較演算子を指定 |
第05引数 | uint | しきいカラーを指定 |
第06引数(略可) | uint | 塗りつぶしカラーを指定 |
第07引数(略可) | uint | マスク値を指定(ソース側のピクセルカラーと論理積される) |
第08引数(略可) | Boolean | true で、比較結果が偽であるピクセルをターゲットにコピー |
戻り値 | Number | 比較結果が真であるピクセルの数 |
■第01引数 (ソース)
ソースとなる、BitmapData オブジェクトを指定します。
「ターゲット」と「ソース」に、同一の BitmapData 指定も可能です。
■第04引数 (比較演算子)
以下の文字列を指定します。
左辺とは、「(ソース側のピクセルカラー) & (第07引数)」です。
右辺とは、「(第05引数) & (第07引数)」です。
文字列 | 解説 |
"<" | (左辺) < (右辺) |
">" | (左辺) > (右辺) |
"<=" | (左辺) <= (右辺) |
">=" | (左辺) >= (右辺) |
"==" | (左辺) == (右辺) |
"!=" | (左辺) != (右辺) |
■第05引数 (しきい値)
しきいとなる ARGB カラーを指定します。
しきい値は、比較の右辺に使われます。
■第06引数 (塗りつぶし ARGB カラー)
塗りつぶす為の、ARGB カラーを指定します。
比較した結果が真の場合、ターゲット側のピクセルが塗りつぶされます。
偽の場合の動作は、第08引数の設定で決まります。
■第07引数 (マスク値)
マスク値は、ソース側のすべてのピクセルカラーと論理積されます。
ARGB カラーのうち、無視したい領域のビットを 0 とします。
例えば、すべてのカラーを考慮したい場合、0xFFFFFFFF を指定します。
例えば、(透過,緑)のみを考慮したい場合、0xFF00FF00 を指定します。
透過成分のマスクは機能しない?ようです。 0xFF000000 は必ず指定します。
■第08引数 (copySource)
比較した結果が偽だった場合の、ピクセルの設定です。
true を指定すると、ソース側のピクセルをターゲットにコピーします。
falseは、何も起こりません。
ターゲット側の元のピクセルが、そのまま残ります。
デフォルトは、false です。
■使用例
しきい値を使って、イメージを転送する
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.display.Shape;
import flash.display.Graphics;
import flash.display.GradientType;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.geom.Matrix;
// ------------------------------------------------------------
// ターゲット用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0x00000000 );
// ------------------------------------------------------------
// ソース用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var source:BitmapData = (function():BitmapData{
// Shape オブジェクトを作成
var shape:Shape = new Shape();
// Shape に矩形を描画
var g:Graphics = shape.graphics;
var mtx:Matrix = new Matrix( 256/1638.4 , 0 , 0 , 256/1638.4 , 128 , 128 );
g.beginGradientFill ( GradientType.RADIAL , [0x000000,0xFFFFFF] , [1.0,1.0] , [0,255] , mtx );
g.moveTo ( 0 , 0 );
g.lineTo ( 0 , 256 );
g.lineTo ( 256 , 256 );
g.lineTo ( 256 , 0 );
g.endFill();
// BitmapData オブジェクトを作成する(32bit)
var bmp_data1:BitmapData = new BitmapData( 256 , 256 , true , 0x00000000 );
// ビットマップに Shape を描画
bmp_data1.draw(shape);
return bmp_data1;
})();
// ------------------------------------------------------------
// スレッショルド用パラメータ
// ------------------------------------------------------------
// ソースの矩形範囲
var source_rect:Rectangle = source.rect;
// ターゲットの位置
var target_pos:Point = new Point( 0 , 0 );
// 比較演算子
var operation:String = "<";
// しきい値
var threshold:uint = 0xFF000000 + (128 << 8);
// 塗りつぶしカラー
var color:uint = 0xFF0000FF;
// マスク値
var mask:uint = 0xFF00FF00;
// 比較結果が偽である場合、ソースからターゲットにコピー
var copy_source:Boolean = true;
// ------------------------------------------------------------
// しきい値を使って、イメージを転送する
// ------------------------------------------------------------
bmp_data.threshold( source , source_rect , target_pos , operation , threshold , color , mask , copy_source );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
ビットマップのエフェクトについて
■カラートランスフォーム変換後の結果を描画する
colorTransform() メソッドを使用します。
呼び出したビットマップに、上書き編集されます。
BitmapData.colorTransform( 適用矩形 , ColorTransform ) :void
第01引数 | Rectangle | 適用矩形範囲を、Rectangle 型で指定 |
第02引数 | ColorTransform | カラー変換を、ColorTransform 型で指定 |
戻り値 | void | なし |
■第02引数 カラートランスフォーム
こちらで解説しています。
■使用例
カラートランスフォーム変換後の結果を描画する
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.ColorTransform;
// ------------------------------------------------------------
// ターゲット用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0xffffb800 );
// ------------------------------------------------------------
// ColorTransform オブジェクトを作成
// ------------------------------------------------------------
var color_transform:ColorTransform = new ColorTransform();
color_transform.redMultiplier = 0.5;
color_transform.greenMultiplier = 0.5;
color_transform.blueMultiplier = 1.0;
color_transform.redOffset = 0;
color_transform.greenOffset = 0;
color_transform.blueOffset = 255;
// ------------------------------------------------------------
// カラートランスフォーム変換後の結果を描画する
// ------------------------------------------------------------
bmp_data.colorTransform( bmp_data.rect , color_transform );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
■フィルタ適用後の結果を描画する
applyFilter() メソッドを使用します。
素材用のビットマップを、ソースといいます。
描画されるビットマップを、ターゲットといいます。
BitmapData.applyFilter( ソース , ソース矩形 , ターゲット側の座標 , フィルタ ) :void
第01引数 | BitmapData | ソースを指定 |
第02引数 | Rectangle | ソースの矩形範囲を、Rectangle 型で指定 |
第03引数 | Point | ターゲット側の配置座標を、Point 型で指定 |
第04引数 | BitmapFilter | フィルタ系のオブジェクトを指定する |
戻り値 | void | なし。 |
■第01引数 (ソース)
ソースとなる、BitmapData オブジェクトを指定します。
「ターゲット」と「ソース」に、同一の BitmapData 指定も可能です。
■第03引数 (ターゲット側の座標)
ターゲット座標系に、第02引数でクリップしたソースを配置します。
実際の描画範囲は、配置したソース矩形範囲よりも肥大します。
■第04引数 (フィルタ)
フィルタについては、こちらで解説しています。
クラス名 | 効果 |
BlurFilter | ブラー(ぼかし) |
BevelFilter | ベベル |
GradientBevelFilter | グラデーションベベル |
GlowFilter | グロー |
GradientGlowFilter | グラデーショングロー |
DropShadowFilter | ドロップシャドウ |
ColorMatrixFilter | カラーマトリックス |
ConvolutionFilter | コンボリューション |
DisplacementMapFilter | ディスプレイスメントマップ |
ShaderFilter | シェーダー |
■ターゲットイメージのサイズについて
■使用例
フィルタ適用後の結果を描画する
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.filters.BlurFilter;
// ------------------------------------------------------------
// ソース用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var source:BitmapData = new BitmapData( 64 , 64 , true , 0xff884400 );
// ------------------------------------------------------------
// BlurFilter オブジェクトを作成する
// ------------------------------------------------------------
var blur_filter:BlurFilter = new BlurFilter( 8 , 8 , 1 );
// ------------------------------------------------------------
// フィルタ適用後のサイズを取得する
// ------------------------------------------------------------
var filter_rect:Rectangle = source.generateFilterRect( source.rect , blur_filter );
// ------------------------------------------------------------
// ターゲット用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( filter_rect.width , filter_rect.height , true , 0x00000000 );
// ------------------------------------------------------------
// フィルタ描画用パラメータ
// ------------------------------------------------------------
// ターゲットの位置
var target_pos:Point = new Point( -filter_rect.x , -filter_rect.y );
// ------------------------------------------------------------
// フィルタ適用後の結果を描画する
// ------------------------------------------------------------
bmp_data.applyFilter( source , source.rect , target_pos , blur_filter );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
■フィルタ適用後のサイズを取得する
generateFilterRect() メソッドを使用します。
このメソッドは、ソースから呼び出します。
BitmapData.generateFilterRect( ソース矩形 , フィルタ ) :Rectangle
第01引数 | Rectangle | ソースの矩形範囲を、Rectangle 型で指定 |
第02引数 | BitmapFilter | フィルタ系のオブジェクトを指定する |
戻り値 | Rectangle | フィルタ適用後のサイズが得られる。 |
■第02引数 (フィルタ)
フィルタについては、こちらで解説しています。
クラス名 | 効果 |
BlurFilter | ブラー(ぼかし) |
BevelFilter | ベベル |
GradientBevelFilter | グラデーションベベル |
GlowFilter | グロー |
GradientGlowFilter | グラデーショングロー |
DropShadowFilter | ドロップシャドウ |
ColorMatrixFilter | カラーマトリックス |
ConvolutionFilter | コンボリューション |
DisplacementMapFilter | ディスプレイスメントマップ |
ShaderFilter | シェーダー |
■使用例
フィルタ適用後のサイズを取得する
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.filters.BlurFilter;
// ------------------------------------------------------------
// ソース用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var source:BitmapData = new BitmapData( 64 , 64 , true , 0xff884400 );
// ------------------------------------------------------------
// BlurFilter オブジェクトを作成する
// ------------------------------------------------------------
var blur_filter:BlurFilter = new BlurFilter( 8 , 8 , 1 );
// ------------------------------------------------------------
// フィルタ適用後のサイズを取得する
// ------------------------------------------------------------
var filter_rect:Rectangle = source.generateFilterRect( source.rect , blur_filter );
// 出力テスト
trace( source.rect ); // x: 0, y: 0, w:64, h:64
trace( filter_rect ); // x:-4, y:-4, w:72, h:72
ランダムノイズを描画する
サンプルをダウンロード
■イメージにランダムノイズを描画する
noise() メソッドを使用します。
BitmapData.noise( 乱数の種 , カラー最小値 , カラー最高値 , カラーチャンネル , グレースケール? ) :void
第01引数 | int | 乱数の種となる、4バイト整数値を指定 |
第02引数 | uint | カラー成分の最小値を指定 (0 ~ 255) |
第03引数 | uint | カラー成分の最大値を指定 (0 ~ 255) |
第04引数(略可) | uint | 使用するカラーチャンネルを論理和で指定 (BitmapDataChannel.*) |
第05引数(略可) | Number | trueでグレースケール化, falseでカラーチャンネルごとにランダム |
戻り値 | void | なし |
■第01引数 (乱数の種)
乱数の種となる、4バイト整数値を指定します。
全く同じ結果を再現したい場合、毎回同じ値を指定します。
■第04引数 (カラーチャンネル)
使用するカラーチャンネルを、論理和で指定します。
デフォルト値は、(4|2|1) です。
赤緑青チャンネルを省略すると、色は 0 となります。
透過チャンネルをを省略すると、色は 255 となります。
定数 | 数値 | 解説 |
BitmapDataChannel.RED | 0x01 | 赤色チャンネル |
BitmapDataChannel.GREEN | 0x02 | 緑色チャンネル |
BitmapDataChannel.BLUE | 0x04 | 青色チャンネル |
BitmapDataChannel.ALPHA | 0x08 | 透過チャンネル |
■第05引数 (グレースケール)
true を指定すると、グレースケール化します。
第04引数の、透過チャンネルの有無で、結果はさらに変化します。
デフォルト値は、false です。
true | false |
■使用例
イメージにランダムノイズを描画する
import flash.display.BitmapData;
import flash.display.BitmapDataChannel;
import flash.display.Bitmap;
import flash.events.Event;
// ------------------------------------------------------------
// ターゲット用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 512 , 512 , true , 0x00000000 );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
// ------------------------------------------------------------
// 毎フレーム実行されるイベント
// ------------------------------------------------------------
stage.addEventListener(Event.ENTER_FRAME , function (e:Event):void{
// ------------------------------------------------------------
// ランダムノイズ描画用パラメータ
// ------------------------------------------------------------
// 乱数の種
var random_seed:int = Math.floor(Math.random() * 0x7FFFFFFF);
// カラー成分の最小値
var color_low:uint = 0;
// カラー成分の最大値
var color_high:uint = 255;
// 使用するカラーチャンネル
var channel_options:uint = (BitmapDataChannel.ALPHA | BitmapDataChannel.RED | BitmapDataChannel.GREEN | BitmapDataChannel.BLUE );
// グレースケール化
var gray_scale:Boolean = false;
// ------------------------------------------------------------
// イメージにランダムノイズを描画する
// ------------------------------------------------------------
bmp_data.noise( random_seed , color_low , color_high , channel_options , gray_scale );
});
パーリンノイズを描画する(Perlin Noise)
サンプルをダウンロード
■ Perlin Noise について
テクスチャを作成する為の、ノイズ関数の一種です。
炎、雷、煙、雲、水、海、波などの表現に使われます。
ビットマップに描画して、素材をリアルタイムに生成できます。
潜在的なサイズは、無限に広がっており、連続して繋がっています。
■イメージにパーリンノイズを描画する
perlinNoise() メソッドを使用します。
BitmapData.perlinNoise( 水平周波数, 垂直周波数, オクターブの個数 , 乱数の種 , タイリング? , フラクタルノイズ? , カラーチャンネル , グレイスケール? , オフセットリスト ) :void
第01引数 | Number | 水平方向の周波数を指定 |
第02引数 | Number | 垂直方向の周波数を指定 |
第03引数 | uint | オクターブの個数、周波数を半分にした結果が、レイヤーのように重なる |
第04引数 | int | 乱数の種となる、4バイト整数値を指定 |
第05引数 | Boolean | trueでタイリング化を試みる, falseで無限大 |
第06引数 | Boolean | trueでフラクタルノイズを生成, falseで乱流を生成 |
第07引数(略可) | uint | 使用するカラーチャンネルを論理和で指定 (BitmapDataChannel.*) |
第08引数(略可) | Boolean | trueでグレースケール化, falseでカラーチャンネルごとにランダム |
第09引数(略可) | Array | 配列に Point オブジェクトを格納して指定。第03引数の個数分用意する。 |
戻り値 | void | なし |
■第01~02引数 (周波数)
周波数を、ピクセル数で指定します。
指定サイズの周期で、明暗の波がちょうど1周します。
第05引数が有効な場合、実際の周波数は、丸め補正されます。
■第03引数 (オクターブの個数)
指定した回数で、重ねて描画されます。
レイヤーのように分離しており、第09引数から配置位置を変更できます。
任意のレイヤーの周波数は、1つ前の周波数を半分にしたものです。
1枚目の周波数 (1/1)
2枚目の周波数 (1/2)
3枚目の周波数 (1/4)
4枚目の周波数 (1/8)
5枚目の周波数 (1/16)
6枚目の周波数 (1/32) ...
個数を増やせば増やすほど、処理コストが比例して増大します。
最低でも、1 を指定します。
■第04引数 (乱数の種)
乱数の種となる、4バイト整数値を指定します。
全く同じ結果を再現したい場合、毎回同じ値を指定します。
■第05引数 (タイリング化)
デフォルトは、false です。
パーリンノイズは、無限に広がっており、すべて自然に繋がっています。
表示位置は、第09引数から変更できます。
true を指定すると、タイル配置した際に、自然に繋がるように補正されます。
タイリングの周期は、ビットマップのサイズです。
■第06引数 (フラクタルノイズ)
true で、フラクタルノイズを生成します。
1枚 透過なし | 1枚 透過あり | 5枚 透過なし | 5枚 透過あり |
false で、乱流的ノイズを生成します。
1枚 透過なし | 1枚 透過あり | 5枚 透過なし | 5枚 透過あり |
■第07引数 (カラーチャンネル)
使用するカラーチャンネルを、論理和で指定します。
デフォルト値は、(4|2|1) です。
赤緑青チャンネルを省略すると、色は 0 となります。
透過チャンネルをを省略すると、色は 255 となります。
定数 | 数値 | 解説 |
BitmapDataChannel.RED | 0x01 | 赤色チャンネル |
BitmapDataChannel.GREEN | 0x02 | 緑色チャンネル |
BitmapDataChannel.BLUE | 0x04 | 青色チャンネル |
BitmapDataChannel.ALPHA | 0x08 | 透過チャンネル |
■第08引数 (グレースケール)
true を指定すると、グレースケール化します。
第07引数の、透過チャンネルの有無で、結果はさらに変化します。
デフォルト値は、false です。
true | false |
■第09引数 (座標リスト)
第03引数で指定した個数分の、レイヤーが存在します。
これらのレイヤーの配置位置を、それぞれ変更できます。
配列を作成し、必要な数だけ Point オブジェクトを格納します。
パーリンノイズは、無限に広がっています。
ビットマップに描画されるのは、その一部です。
■パーリンノイズの描画例
■1枚描画
イメージにランダムノイズを描画する
import flash.display.BitmapData;
import flash.display.BitmapDataChannel;
import flash.display.Bitmap;
// ------------------------------------------------------------
// ターゲット用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new flash.display.BitmapData( 512 , 512 , true , 0x00000000 );
// ------------------------------------------------------------
// パーリンノイズ描画用パラメータ
// ------------------------------------------------------------
// 水平方向の周波数
var base_x:Number = 64;
// 垂直方向の周波数
var base_y:Number = 64;
// オクターブの個数
var num_octaves:uint = 1;
// 乱数の種
var random_seed:int = Math.floor(Math.random() * 0x7FFFFFFF);
// タイリング化
var stitch:Boolean = false;
// フラクタルノイズを使用
var fractal_noise:Boolean = false;
// 使用するカラーチャンネル
var channel_options:uint = (BitmapDataChannel.RED | BitmapDataChannel.GREEN | BitmapDataChannel.BLUE );
// グレースケール化
var gray_scale:Boolean = false;
// ------------------------------------------------------------
// イメージにパーリンノイズを描画する
// ------------------------------------------------------------
bmp_data.perlinNoise( base_x , base_y , num_octaves , random_seed , stitch , fractal_noise ,channel_options , gray_scale );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
■複数枚スクロールアニメ
パーリンノイズをスクロールアニメ
import flash.display.BitmapData;
import flash.display.BitmapDataChannel;
import flash.display.Bitmap;
import flash.geom.Point;
import flash.events.Event;
// ------------------------------------------------------------
// ターゲット用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 256 , 256 , true , 0x00000000 );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
// ------------------------------------------------------------
// パーリンノイズ描画用パラメータ
// ------------------------------------------------------------
// 水平方向の周波数
var base_x:Number = 128;
// 垂直方向の周波数
var base_y:Number = 128;
// オクターブの個数
var num_octaves:uint = 3;
// 乱数の種
var random_seed:int = Math.floor(Math.random() * 0x7FFFFFFF);
// タイリング化
var stitch:Boolean = false;
// フラクタルノイズを使用
var fractal_noise:Boolean = false;
// 使用するカラーチャンネル
var channel_options:uint = (0);
// グレースケール化
var gray_scale:Boolean = true;
// オフセットリスト
var offset_list:Array = new Array();
// 速度リスト
var speed_list:Array = new Array();
// ------------------------------------------------------------
// オフセットリストを初期化
// ------------------------------------------------------------
var speed:Number = Math.random() * 0.5 + 2;
var rotate:Number = Math.PI * 2.0 * Math.random();
var i:int;
for(i=0;i < num_octaves;i++){
// 位置ベクトル
var pos:Point = new Point( 0 , 0 );
// 速度ベクトル
var r:Number = (30 * (Math.random() * 2 - 1) + rotate) * Math.PI / 180;
var s:Number = (0.25) * (Math.random() * 2 - 1) + speed;
var spd:Point = new Point( Math.cos(r) * s , Math.sin(r) * s );
speed *= 0.75;
offset_list[i] = pos;
speed_list[i] = spd;
}
// ------------------------------------------------------------
// 毎フレーム実行されるイベント
// ------------------------------------------------------------
stage.addEventListener(Event.ENTER_FRAME , function (e:Event):void{
// ------------------------------------------------------------
// オフセットを加算
// ------------------------------------------------------------
var i:int;
for(i=0;i < num_octaves;i++){
var pos:Point = offset_list[i];
var spd:Point = speed_list[i];
pos.x += spd.x;
pos.y += spd.y;
}
// ------------------------------------------------------------
// イメージにパーリンノイズを描画する
// ------------------------------------------------------------
bmp_data.perlinNoise( base_x , base_y , num_octaves , random_seed , stitch , fractal_noise ,channel_options , gray_scale , offset_list );
});
イメージ間をピクセルディゾルブでつなぐ
サンプルをダウンロード
■イメージをピクセルディゾルブで置換する
■ピクセルディゾルブ処理について
2つのビットマップデータを用意します。
素材用のビットマップを、ソースといいます。
編集されるビットマップを、ターゲットといいます。
ターゲット | ソース |
ターゲットの、元のイメージは重要です。
「ターゲット」から「ソース」へと、絵が少しずつ変化します。
指定した個数ずつ、ピクセル単位で置換されます。
結果は、ターゲットに反映されます。(破壊編集)
ターゲット | ソース |
■イメージをピクセルディゾルブで置換する
pixelDissolve() メソッドを使用します。
このメソッドは、何度か繰り返して実行します。
BitmapData.pixelDissolve( ソース , ソース矩形 , ターゲット側の座標 , 乱数の種 , 置換ピクセル数 , ARGBカラー ) :int
第01引数 | BitmapData | ソースを指定 |
第02引数 | Rectangle | ソースの矩形範囲を、Rectangle 型で指定 |
第03引数 | Point | ターゲット側の配置座標を、Point 型で指定 |
第04引数(略可) | int | 乱数の種となる、4バイト整数値を指定(2回目以降は、戻り値から得られた値を指定) |
第05引数(略可) | int | 1度に置換するピクセル数を指定 |
第06引数(略可) | uint | ARGB カラーを指定。(ターゲットとソースが同一である場合、単一色で塗りつぶされる) |
戻り値 | int | 新しい乱数の種 |
■第01引数 (ソース)
ソースとなる、BitmapData オブジェクトを指定します。
■第02引数 (ソース側の矩形範囲)
ソース側の矩形範囲を、Rectangle 型で指定します。
この幅と高さから、置換する総ピクセル数が確定します。
(総ピクセル数) = (ソース矩形の幅) * (ソース矩形の高さ)
■第04引数 (乱数の種)
1回目の呼び出しは、好きな4バイト整数値(乱数の種)を指定します。
戻り値から、新しい乱数の種が得られます。
2回目以降の呼び出しは、この乱数の種を指定します。
■第05引数 (置換ピクセル数)
1回の処理で置換する、ピクセル数を指定します。
総ピクセル数は、第03引数で確定します。
このメソッドを実行する回数は、第03引数と第05引数で確定します。
(実行回数) = Math.ceil( (総ピクセル数) * (第05引数) )
好きなフレーム数から、第05引数の値を計算する事もできます。
(第05引数) = Math.ceil( (総ピクセル数) / (実行回数) )
■第06引数 (ARGBカラー)
指定した、ARGB カラーで塗りつぶされます。
これは、ターゲットとソースが同一である場合のみ、効果があります。
■使用例
イメージをピクセルディゾルブで置換する
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Rectangle;
import flash.geom.Point;
// ------------------------------------------------------------
// ターゲット用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var bmp_data:BitmapData = new BitmapData( 256 , 256 , true , 0xffffc0c0 );
// ------------------------------------------------------------
// ソース用 BitmapData オブジェクトを作成する(32bit)
// ------------------------------------------------------------
var source:BitmapData = new BitmapData( 256 , 256 , true , 0xff0000ff );
// ------------------------------------------------------------
// ステージに配置する
// ------------------------------------------------------------
var bitmap_obj:Bitmap = new Bitmap(bmp_data);
stage.addChild( bitmap_obj );
// ------------------------------------------------------------
// ピクセルディゾルブ用パラメータ
// ------------------------------------------------------------
// ソースの矩形範囲
var source_rect:Rectangle = source.rect;
// ターゲットの位置
var target_pos:Point = new Point( 0 , 0 );
// 乱数の種
var random_seed:Number = Math.floor(Math.random() * 0x7FFFFFFF);
// ------------------------------------------------------------
// ピクセル数を計算
// ------------------------------------------------------------
// 総ピクセル数
var total:int = (source_rect.width * source_rect.height);
// 残りのピクセル数
var remnant:int = total;
// 1回の処理で置換するピクセル数(ここでは 120 フレーム分)
var number_of_pixels:int = Math.ceil(total / 120);
// ------------------------------------------------------------
// 毎フレーム実行されるイベント
// ------------------------------------------------------------
stage.addEventListener(Event.ENTER_FRAME , function callee(e:Event):void{
// ------------------------------------------------------------
// イメージをピクセルディゾルブで置換する
// ------------------------------------------------------------
random_seed = bmp_data.pixelDissolve( source , source_rect , target_pos , random_seed , number_of_pixels );
// ------------------------------------------------------------
// 終了チェック
// ------------------------------------------------------------
remnant -= number_of_pixels;
if(remnant <= 0){
e.currentTarget.removeEventListener(e.type , callee);
}
});