2012-05-10 126 views
0

我不斷收到這個錯誤,它讓我瘋狂。這是我第一次試圖將Flash MovieClip導出爲可下載的*.PNG文件。我遵循在線指南並實施了Adobe的PNGEncoder.as「圖像」。TypeError:錯誤#1006:編碼不是函數

Guide: http://permadi.com/blog/2011/02/flash-as3-saving-image-to-disk/ PNGEncoder: https://github.com/mikechambers/as3corelib/tree/master/src/com/adobe/images/

我成立了PNGEncoder.as類和改變首選項,以便Flash會認識到它(確認)。現在,當我運行SWF並單擊該按鈕,它什麼都不做和OUTPUT說TypeError: Error #1006: encode is not a function.

import flash.display.MovieClip; 
import flash.display.Bitmap; 
import customClasses.PNGEncoder; 
import flash.net.FileReference; 
import flash.utils.ByteArray; 

stop(); 

/* 
CAMERA button command 
Opens download command window to save instance of theBike as .PNG 

*/ 

CAMERA.addEventListener(MouseEvent.CLICK, fl_ClickToGoToAndStopAtFrame_20); 

function fl_ClickToGoToAndStopAtFrame_20(event:MouseEvent):void 
{ 
// source for the bitmap data in this case is a text field 
var tf:MovieClip = Object(root).bike; 

// create new transparent BitmapData object to hold the captured data 
// BitmapData(width, height, transparent, color) 
var myBitmapData:BitmapData = new BitmapData(640, 406, true, 0x000000); 

// draw the source data into the BitmapData object 
myBitmapData.draw(tf); 

// make a new Bitmap object and populate with the BitmapData object 
var bmp:Bitmap = new Bitmap(myBitmapData); 

var myPNG:PNGEncoder = new PNGEncoder(); 
var byteArray:ByteArray = myPNG.encode(myBitmapData); <-- PROBLEM HERE 

var fileReference:FileReference=new FileReference(); 
fileReference.save(byteArray, "bike.png"); 
} 

從PNGEncoder.as:

package customClasses 
{ 
    import flash.geom.*; 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.utils.ByteArray; 

/** 
* Class that converts BitmapData into a valid PNG 
*/ 
public class PNGEncoder 
{ 
    /** 
    * Created a PNG image from the specified BitmapData 
    * 
    * @param image The BitmapData that will be converted into the PNG format. 
    * @return a ByteArray representing the PNG encoded image data. 
    */   
    public static function encode(img:BitmapData):ByteArray { 
     // Create output byte array 
     var png:ByteArray = new ByteArray(); 
     // Write PNG signature 
     png.writeUnsignedInt(0x89504e47); 
     png.writeUnsignedInt(0x0D0A1A0A); 
     // Build IHDR chunk 
     var IHDR:ByteArray = new ByteArray(); 
     IHDR.writeInt(img.width); 
     IHDR.writeInt(img.height); 
     IHDR.writeUnsignedInt(0x08060000); // 32bit RGBA 
     IHDR.writeByte(0); 
     writeChunk(png,0x49484452,IHDR); 
     // Build IDAT chunk 
     var IDAT:ByteArray= new ByteArray(); 
     for(var i:int=0;i < img.height;i++) { 
      // no filter 
      IDAT.writeByte(0); 
      var p:uint; 
      var j:int; 
      if (!img.transparent) { 
       for(j=0;j < img.width;j++) { 
        p = img.getPixel(j,i); 
        IDAT.writeUnsignedInt(
         uint(((p&0xFFFFFF) << 8)|0xFF)); 
       } 
      } else { 
       for(j=0;j < img.width;j++) { 
        p = img.getPixel32(j,i); 
        IDAT.writeUnsignedInt(
         uint(((p&0xFFFFFF) << 8)| 
         (p>>>24))); 
       } 
      } 
     } 
     IDAT.compress(); 
     writeChunk(png,0x49444154,IDAT); 
     // Build IEND chunk 
     writeChunk(png,0x49454E44,null); 
     // return PNG 
     return png; 
    } 

    private static var crcTable:Array; 
    private static var crcTableComputed:Boolean = false; 

    private static function writeChunk(png:ByteArray, 
      type:uint, data:ByteArray):void { 
     if (!crcTableComputed) { 
      crcTableComputed = true; 
      crcTable = []; 
      var c:uint; 
      for (var n:uint = 0; n < 256; n++) { 
       c = n; 
       for (var k:uint = 0; k < 8; k++) { 
        if (c & 1) { 
         c = uint(uint(0xedb88320)^
          uint(c >>> 1)); 
        } else { 
         c = uint(c >>> 1); 
        } 
       } 
       crcTable[n] = c; 
      } 
     } 
     var len:uint = 0; 
     if (data != null) { 
      len = data.length; 
     } 
     png.writeUnsignedInt(len); 
     var p:uint = png.position; 
     png.writeUnsignedInt(type); 
     if (data != null) { 
      png.writeBytes(data); 
     } 
     var e:uint = png.position; 
     png.position = p; 
     c = 0xffffffff; 
     for (var i:int = 0; i < (e-p); i++) { 
      c = uint(crcTable[ 
       (c^png.readUnsignedByte()) & 
       uint(0xff)]^uint(c >>> 8)); 
     } 
     c = uint(c^uint(0xffffffff)); 
     png.position = e; 
     png.writeUnsignedInt(c); 
    } 
} 
} 

我已經通過論壇,搜索到這裏,我已經注意到了類似的問題,但我還沒有想出如何解決這個問題呢。如果您有任何想法,請幫忙!

回答

1

也許是因爲您已將encode()設爲靜態?請參閱here

順便說一句,我希望你使用這個小圖像,因爲「沒有過濾器」PNG會相當大。

+0

謝謝你們。我試着讓encode()不是靜態的,但仍然是一樣的。至於大的圖像..我想我一定要解決一個問題,但謝謝你的提醒。 有沒有其他想法? – ekskyknaus

+0

順便說一句,我沒有寫自己的PNG圖像代碼..發現在線腳本。我還沒有想出這個問題,有什麼想法? – ekskyknaus

相關問題