Lingoでイメージを加工する
Director 8.0からビットマップを加工するための強力なLingoが採用されました。それらのLingoを利用したサンプルスクリプトをご紹介します。| 1 | ビットマップを水平方向に反転する 以下のムービースクリプトは、ビットマップキャストメンバーを水平方向に反転させた新規のキャストメンバーを作成し、その参照を返します。たとえば、このムービースクリプトを使って、現在スプライト1に設定されているビットマップキャストメンバーを反転した新規キャストメンバーに変更するには、以下のステートメントを実行します。 sprite(1).member = xFlipMemberH(sprite(1).member) -- [ビットマップキャストメンバーを水平方向に反転させたキャストメンバー作成] on xFlipMemberH memberRef -- [1]ビットマップキャストメンバーから元となるイメージオブジェクトの参照を取得 sourceImage = memberRef.image -- [2]元イメージの幅と高さを取得 sourceWidth = sourceImage.width sourceHeight = sourceImage.height -- [3]元イメージと同サイズの新規イメージオブジェクトを作成 newImage = image(sourceWidth, sourceHeight, memberRef.depth) -- [4]元イメージを新規イメージオブジェクトに水平方向逆向きにコピー repeat with i = 1 to sourceWidth -- [5]コピー先矩形を左から縦に1ピクセルずつ指定 destinationRect = rect(i - 1, 0, i, sourceHeight) -- [6]コピー元矩形を右から縦に1ピクセルずつ指定 sourceRect = rect(sourceWidth - i, 0, sourceWidth - i + 1, sourceHeight) -- [7]元イメージからコピー元矩形を新規イメージのコピー先矩形にコピー newImage.copyPixels(sourceImage, destinationRect, sourceRect) end repeat -- [8]新規ビットマップキャストメンバーを作成 newBitmap = new(#bitmap) -- [9]コピー後のイメージオブジェクトを新規ビットマップキャストメンバーのイメージに設定 newBitmap.image = newImage -- [10]新規ビットマップキャストメンバーの参照を返す return newBitmap end スクリプトについて、簡単に解説します。なお、スクリプト中で使用されているプロパティ・関数・キーワード・コマンド等について、詳しくはオンラインヘルプあるいは『Lingo辞書』をご参照ください。 [1]パラメータとして渡されたビットマップキャストメンバーの参照から、元となるイメージオブジェクトの参照を取得します。イメージの加工は、基本的にイメージオブジェクトを媒介として行います。そのイメージオブジェクトを参照するのが、プロパティ'image'です。以降のステートメントでは、この元イメージオブジェクトを使って処理を進めます。 [2]元となるイメージオブジェクト参照からイメージの幅と高さを取得します。 [3]'image()'関数を使って、元イメージオブジェクトと同じサイズ・色深度の新規イメージオブジェクトを作成します。新規イメージオブジェクトを作成する'image()'関数は、イメージオブジェクトを参照する'image'プロパティとは異なりますので、ご注意ください。 [4]'repeat'構文によるループ処理で、元イメージオブジェクトを縦1ピクセルずつ、新規イメージオブジェクトの水平方向反対側にコピーします。 [5]新規イメージオブジェクトへのコピー先矩形を、左から縦1ピクセルずつ指定します。矩形の左上は、値0からスタートします。したがって、最初の矩形は'rect(0,0, 1, sourceHeight)になります。 [6]元イメージオブジェクトのコピー元矩形を、右から縦1ピクセルずつ指定します。最初は、'rect(sourceWidth - 1, 0, sourceWidth, sourceHeight)'の矩形からスタートします。 [7]'copyPixels()'関数を使って、元イメージオブジェクトのコピー元矩形を、新規イメージオブジェクトのコピー先矩形(quad)にコピーします。 [8]反転コピーしたイメージオブジェクトを設定するための、新規ビットマップキャストメンバーを作成します。 [9]反転コピーした新規イメージオブジェクトを、作成したビットマップキャストメンバーに設定します。 [10]反転コピーしたイメージの設定されたビットマップキャストメンバーの参照を返します。 |
| 2 | ビットマップをグレースケールに変換する 以下のムービースクリプトは、ビットマップキャストメンバーをグレースケールに変換した新規のキャストメンバーを作成し、その参照を返します。1の「ビットマップを反転する」ムービースクリプトと同様に、以下のステートメントでグレースケールに変換したビットマップキャストメンバーを参照できます。 xChangeToGray(ビットマップキャストメンバー) -- [ビットマップキャストメンバーをグレイスケールに変換したキャストメンバー作成] on xChangeToGray memberRef --[1]コピー元イメージオブジェクトの参照とサイズを取得 sourceImage = memberRef.image sourceWidth = sourceImage.width sourceHeight = sourceImage.height -- 元イメージと同サイズの新規イメージオブジェクトを作成 newImage = image(sourceWidth, sourceHeight, memberRef.depth) -- [2]元イメージを1ピクセルずつグレースケールに変換 repeat with i = 0 to sourceWidth - 1 repeat with j = 0 to sourceHeight - 1 -- [3]元イメージの対象ピクセルのカラー値を取得 lColor = sourceImage.getPixel(i, j) -- [4]取得したカラー値からグレースケール値を算出 nGray = lColor.red * .3 + lColor.green * .59 + lColor.blue * .11 -- [5]新規イメージの同じポイントにグレースケールのカラー値を設定 newImage.setPixel(i, j, rgb(nGray, nGray, nGray)) end repeat end repeat -- [6]新規ビットマップキャストメンバーにグレースケールイメージを設定して返す newBitmap = new(#bitmap) newBitmap.image = newImage return newBitmap end スクリプトについて、簡単に解説します。 [1]コピー元イメージオブジェクトの参照とそのサイズを取得したうえで、同じサイズ・色深度の新規イメージオブジェクトを作成します。これらの処理は、1の「ビットマップを水平方向に反転する」ムービースクリプトと同様です。 [2]元イメージオブジェクトの左上から1ピクセルずつカラー値を取得し、新規イメージオブジェクトの同じポイントをグレースケールに変換したカラー値に設定します。水平方向と垂直方向を1ピクセルずつ処理するために、それぞれの方向に対して2つの'repeat'構文を入れ子にしています。 [3]'getPixel()'関数を使って、対象ピクセルのカラー値を取得しています。対象となるイメージオブジェクトの左上のポイントは、'point(0, 0)'で始まります。したがって、最後の右下のポイントは、'point(sourceWidth - 1, sourceHeight -1)になります。 [4]取得したカラー値から、グレースケール値を算出します。カラー値のRGB各色要素は、'red'、'green'、'blue'で取得できます。これらをグレースケール値に変換する場合、各色要素の明るさが異なることに注意が必要です。緑100%(値255)は、青100%(値255)よりずっと明るく見えます。この変換は以下の式で計算できます。 グレー値 = 赤 * 0.3 + 緑 * 0.59 + 青 * 0.11 この式から得られた値を、全色要素に設定するとグレースケールのカラー値になります(全色要素の値が等しいときグレーになります)。 [5]'setPixel()'関数を使って、新規イメージオブジェクトの同じポイントにグレースケールのカラー値を設定します。RGBのカラー値は、'rgb()'関数で設定できます。各色要素の値は0~255の整数を指定します。 [6]グレースケールに変換したイメージオブジェクトを新規ビットマップキャストメンバーに設定して、その参照を返します。これらの処理は、1の「ビットマップを水平方向に反転する」ムービースクリプトと同様です。 |
