zoukankan      html  css  js  c++  java
  • PNGEncoder里是如何处理PNG图片透明

     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);
  • 相关阅读:
    【力扣】461. 汉明距离
    【力扣】206. 反转链表
    【力扣】169. 多数元素
    LINQ 基本子句之三 let
    LINQ 基本子句之二 join
    LINQ 基本子句之一 (select/where/group/into)
    关于Console的Main(String[] args)参数输入
    SQL Common Sense 碎片一
    简单组合条件查询
    关于SQL 系统自带存储过程的使用 (一)
  • 原文地址:https://www.cnblogs.com/sevenyuan/p/1606579.html
Copyright © 2011-2022 走看看