• atwiki
  • KNDY
  • 8ビット グレースケールBMPエンコーダ

KNDY

8ビット グレースケールBMPエンコーダ

最終更新:

kndy

- view
管理者のみ編集可
つくってみた。
こちらに載っていたソースを参考に、というかほとんど丸パクリしました。
BMP8Encoder.encode(BitmapData)で8ビットのグレースケールBMPのバイトアレイに変換するという代物。
果たして何かに使えんのか?ということになるが、実はASでSAIのテクスチャ用ファイルが出力できねぇかなー、と思ったので作ってみたのでした。
(それにしたって、SAIのテクスチャってなんで8bitBMPなのかねぇ。SAI本体で編集出来りゃいいのに。)

サンプル


まずマウスで上のSWFにフォーカスしてください。
スペース以外のキーで色が変わります。スペースを押すとグレースケール変換を行い8ビットBMPを出力します。
例によってBase64を使ってるのでIEでは動きません多分。

ソォス

BMP8Encoder.as

  1. package
  2. {
  3. import flash.display.BitmapData;
  4. import flash.utils.ByteArray;
  5. import flash.utils.Endian;
  6.  
  7. public class BMP8Encoder
  8. {
  9. public static function encode(img:BitmapData):ByteArray
  10. {
  11. var width: uint = img.width;
  12. var height:uint = img.height;
  13. var odd: uint = - width % 16;
  14.  
  15. var bmp:ByteArray = new ByteArray();
  16. bmp.endian = Endian.LITTLE_ENDIAN;
  17.  
  18. var size:uint = width * height;
  19. bmp.writeShort(0x4D42);
  20.  
  21. bmp.writeUnsignedInt(size + 1024+ 54 + 2);
  22.  
  23. bmp.writeUnsignedInt(0);
  24. bmp.writeUnsignedInt(1024+54);
  25.  
  26. bmp.writeUnsignedInt(40);
  27. bmp.writeInt(width);
  28. bmp.writeInt(height);
  29. bmp.writeShort(1);
  30. bmp.writeShort(8);
  31. bmp.writeUnsignedInt(0);
  32. bmp.writeUnsignedInt(size+2);
  33. bmp.writeInt(0);
  34. bmp.writeInt(0);
  35. bmp.writeUnsignedInt(0);
  36. bmp.writeUnsignedInt(0);
  37. for (var i: uint = 0; i <= 255; i++)
  38. {
  39. bmp.writeByte(i);
  40. bmp.writeByte(i);
  41. bmp.writeByte(i);
  42. bmp.writeByte(0);
  43. }
  44. var pixel:uint
  45. var x:uint, y:uint;
  46. var aa:uint;
  47. var rr:uint;
  48. var gg: uint;
  49. var bb: uint;
  50. for (y = 0; y < height; y++) {
  51. for (x = 0; x < width; x++) {
  52. pixel = img.getPixel32(x, height-y-1);
  53. aa = pixel;
  54. aa >>>= 24;
  55. pixel -= (aa << 24);
  56. rr = pixel;
  57. rr >>>= 16;
  58. pixel -= (rr << 16);
  59. gg = pixel;
  60. gg >>>= 8;
  61. pixel -= (gg << 8);
  62. bb = pixel;
  63.  
  64. rr = Math.floor(rr * aa / 255+255-aa );
  65. gg = Math.floor(gg * aa / 255+255-aa);
  66. bb = Math.floor(bb * aa / 255+255-aa);
  67. aa = Math.floor(rr * 0.29891 + gg * 0.58661 + bb * 0.11448);
  68. if (aa >= 256) aa = 255;
  69. bmp.writeByte(aa);
  70. }
  71. for (x = 0; x < odd; x++)bmp.writeByte(0);
  72. }
  73. bmp.writeShort(0);
  74. return bmp;
  75. }
  76. }
  77. }
  78.  
  79.  

▲上へ
(最終更新日:2008年09月21日)

&link_trackback(text=トラックバック表示)

名前:
コメント:

タグ:

ActionScript SAI
記事メニュー
目安箱バナー