KNDY
8ビット グレースケールBMPエンコーダ
最終更新:
kndy
-
view
つくってみた。
こちらに載っていたソースを参考に、というかほとんど丸パクリしました。
BMP8Encoder.encode(BitmapData)で8ビットのグレースケールBMPのバイトアレイに変換するという代物。
果たして何かに使えんのか?ということになるが、実はASでSAIのテクスチャ用ファイルが出力できねぇかなー、と思ったので作ってみたのでした。
(それにしたって、SAIのテクスチャってなんで8bitBMPなのかねぇ。SAI本体で編集出来りゃいいのに。)
こちらに載っていたソースを参考に、というかほとんど丸パクリしました。
BMP8Encoder.encode(BitmapData)で8ビットのグレースケールBMPのバイトアレイに変換するという代物。
果たして何かに使えんのか?ということになるが、実はASでSAIのテクスチャ用ファイルが出力できねぇかなー、と思ったので作ってみたのでした。
(それにしたって、SAIのテクスチャってなんで8bitBMPなのかねぇ。SAI本体で編集出来りゃいいのに。)
サンプル
まずマウスで上のSWFにフォーカスしてください。
スペース以外のキーで色が変わります。スペースを押すとグレースケール変換を行い8ビットBMPを出力します。
例によってBase64を使ってるのでIEでは動きません多分。
ソォス
BMP8Encoder.as
- package
- {
- import flash.display.BitmapData;
- import flash.utils.ByteArray;
- import flash.utils.Endian;
-
- public class BMP8Encoder
- {
- public static function encode(img:BitmapData):ByteArray
- {
- var width: uint = img.width;
- var height:uint = img.height;
- var odd: uint = - width % 16;
-
- var bmp:ByteArray = new ByteArray();
- bmp.endian = Endian.LITTLE_ENDIAN;
-
- var size:uint = width * height;
- bmp.writeShort(0x4D42);
-
- bmp.writeUnsignedInt(size + 1024+ 54 + 2);
-
- bmp.writeUnsignedInt(0);
- bmp.writeUnsignedInt(1024+54);
-
- bmp.writeUnsignedInt(40);
- bmp.writeInt(width);
- bmp.writeInt(height);
- bmp.writeShort(1);
- bmp.writeShort(8);
- bmp.writeUnsignedInt(0);
- bmp.writeUnsignedInt(size+2);
- bmp.writeInt(0);
- bmp.writeInt(0);
- bmp.writeUnsignedInt(0);
- bmp.writeUnsignedInt(0);
- for (var i: uint = 0; i <= 255; i++)
- {
- bmp.writeByte(i);
- bmp.writeByte(i);
- bmp.writeByte(i);
- bmp.writeByte(0);
- }
- var pixel:uint
- var x:uint, y:uint;
- var aa:uint;
- var rr:uint;
- var gg: uint;
- var bb: uint;
- for (y = 0; y < height; y++) {
- for (x = 0; x < width; x++) {
- pixel = img.getPixel32(x, height-y-1);
- aa = pixel;
- aa >>>= 24;
- pixel -= (aa << 24);
- rr = pixel;
- rr >>>= 16;
- pixel -= (rr << 16);
- gg = pixel;
- gg >>>= 8;
- pixel -= (gg << 8);
- bb = pixel;
-
- rr = Math.floor(rr * aa / 255+255-aa );
- gg = Math.floor(gg * aa / 255+255-aa);
- bb = Math.floor(bb * aa / 255+255-aa);
- aa = Math.floor(rr * 0.29891 + gg * 0.58661 + bb * 0.11448);
- if (aa >= 256) aa = 255;
- bmp.writeByte(aa);
- }
- for (x = 0; x < odd; x++)bmp.writeByte(0);
- }
- bmp.writeShort(0);
- return bmp;
- }
- }
- }
-
-
▲上へ
(最終更新日:2008年09月21日)
(最終更新日:2008年09月21日)
&link_trackback(text=トラックバック表示)