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
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);
var myBitmapData:BitmapData = new BitmapData(480, 360,true,0x00);
myBitmapData.draw(_base);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述