1 package

 2 {

 3         import flash.geom.*;

 4         import flash.display.*;

 5         import flash.utils.*;

 6         public class PNGEncoder

 7         {

 8 

 9             public static function encode(img:BitmapData):ByteArray {

10                 // Create output byte array

11                 var png:ByteArray = new ByteArray();

12                 // Write PNG signature

13                 png.writeUnsignedInt(0x89504e47);

14                 png.writeUnsignedInt(0x0D0A1A0A);

15                 // Build IHDR chunk

16                 var IHDR:ByteArray = new ByteArray();

17                 IHDR.writeInt(img.width);

18                 IHDR.writeInt(img.height);

19                 IHDR.writeUnsignedInt(0x08060000); // 32bit RGBA

20                 IHDR.writeByte(0);

21                 writeChunk(png,0x49484452,IHDR);

22                 // Build IDAT chunk

23                 var IDAT:ByteArray= new ByteArray();

24                 for(var i:int=0;i < img.height;i++) {

25                     // no filter

26                     IDAT.writeByte(0);

27                     var p:uint;

28                     if ( !img.transparent ) {

29                         for(var j:int=0;j < img.width;j++) {

30                             p = img.getPixel(j,i);

31                             IDAT.writeUnsignedInt(

32                                 uint(((p&0xFFFFFF) << 8)|0xFF));

33                         }

34                     } else {

35                         for(var k:int=0;k < img.width;k++) {

36                             p = img.getPixel32(k,i);

37                             IDAT.writeUnsignedInt(

38                                 uint(((p&0xFFFFFF) << 8)|(p >>> 24)));

39                         }

40                     }

41                 }

42                 IDAT.compress();

43                 writeChunk(png,0x49444154,IDAT);

44                 // Build IEND chunk

45                 writeChunk(png,0x49454E44,null);

46                 // return PNG

47                 return png;

48             }

49 

50             private static var crcTable:Array;

51             private static var crcTableComputed:Boolean = false;

52 

53             private static function writeChunk(png:ByteArray,

54                     type:uint, data:ByteArray) {

55                 if (!crcTableComputed) {

56                     crcTableComputed = true;

57                     crcTable = [];

58                     for (var n:uint = 0; n < 256; n++) {

59                         var c_1:uint = n;

60                         for (var k:uint = 0; k < 8; k++) {

61                             if (c_1 & 1) {

62                                 c_1 = uint(uint(0xedb88320) ^

63                                     uint(c_1 >>> 1));

64                             } else {

65                                 c_1 = uint(c_1 >>> 1);

66                             }

67                         }

68                         crcTable[n] = c_1;

69                     }

70                 }

71                 var len:uint = 0;

72                 if (data != null) {

73                     len = data.length;

74                 }

75                 png.writeUnsignedInt(len);

76                 var p:uint = png.position;

77                 png.writeUnsignedInt(type);

78                 if ( data != null ) {

79                     png.writeBytes(data);

80                 }

81                 var e:uint = png.position;

82                 png.position = p;

83                 var c:uint = 0xffffffff;

84                 for (var i:int = 0; i < (e-p); i++) {

85                     c = uint(crcTable[

86                         (c ^ png.readUnsignedByte()) &

87                         uint(0xff)] ^ uint(c >>> 8));

88                 }

89                 c = uint(c^uint(0xffffffff));

90                 png.position = e;

91                 png.writeUnsignedInt(c);

92             }

93         }

94 }

95 

96 

97 


问题已经解决


只用在 new BitmapData()里加上最后一个参数赋值为0x00就可以了.经试验正确无误.


var myBitmapData:BitmapData = new BitmapData(480, 360,true,0x00);

myBitmapData.draw(_base);