智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...

导航

SWFKit+BitmapData,生成本地JPG

Posted on 2009-11-20 17:44  Bill Yuan  阅读(443)  评论(0编辑  收藏  举报
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//功能注:转换BitmapData成JPG,用SWFKit打包后不需要服务器和其它外部控件支持既可直接在本地生成图片
//汇源者:大盗二十八
//拓展注:读取,混淆,生成,还原任意二进制文件,其它您能想到的,前提是自己清楚加密算法哈
//用法注:第一步,Flash cs3,建立一个包含图片的mc,然后删除,再在库中设置该mc的链接名为"mc",拖个Button组件到库中,在场景第一帧加上as;
//用法注:第二步,SWFKit Pro3.4(3.2版本也可),导入swf后,在Scripts窗口右上方Items处下拉条选择Initialize,然后粘贴属于FFish的函数代码。
//////////////////////////////////////////////////////////////////////////////////////////////////////////
/
import flash.display.Sprite;
import fl.controls.Button;
import flash.events.MouseEvent;
import mx.graphics.codec.JPEGEncoder;
import Base64;
import SWFKit.*;
var P_Btn1: Button;
var P_Btn2: Button;
var P_line: Sprite;
var P_Box : Sprite;
var P_Pic 
= new mc();
function Paint_it() {
    P_Btn1 
= new Button();
    P_Btn1.y 
= 350;
    P_Btn1.x 
= 5;
    P_Btn1.label 
= "清除";
    P_Btn2 
= new Button();
    P_Btn2.y 
= 390;
    P_Btn2.x 
= 5;
    P_Btn2.label 
= "保存";
    addChild(P_Btn1);
    addChild(P_Btn2);
    
    P_Btn1.addEventListener(MouseEvent.MOUSE_DOWN, P_Clear);
    P_Btn2.addEventListener(MouseEvent.MOUSE_DOWN, P_Save);
    addEventListener(MouseEvent.MOUSE_DOWN, P_Down);
    addEventListener(MouseEvent.MOUSE_UP, P_Up);
    P_Box 
= new Sprite();
    P_line 
= new Sprite();
    P_line.graphics.lineStyle(
5,0xffcc00);
    addChild(P_Box);
    P_Box.addChild(P_Pic);
    P_Pic.addChild(P_line);
    P_Pic.x 
= 110;
    P_Pic.y 
= 5;
}
function P_Clear(event:MouseEvent):
void {
    event.stopPropagation();
//看帮助吧,很详尽,呵呵。
    
    P_line.graphics.clear();
    P_line.graphics.lineStyle(
5,0xffcc00);
}
function P_Save(event:MouseEvent):
void {
    event.stopPropagation();
    
    var P_Bmp:BitmapData  
= new BitmapData(P_Pic.width, P_Pic.height);
    P_Bmp.draw(P_Pic);
    
    var P_Jpg:JPEGEncoder 
= new JPEGEncoder(75);
    var P_Byte:ByteArray 
= P_Jpg.encode(P_Bmp);
    
    var encoded:String 
= Base64.encodeByteArray(P_Byte);
    ExternalInterface.call(
"saveByte", encoded);//直接调用SWFKit的FFish Script语言Initialize标签saveByte函数,传递字符串。
//这个是两软件交换数据之处!
}
function P_Down(event:MouseEvent):
void {
    addEventListener(MouseEvent.MOUSE_MOVE, P_Move);
    P_line.graphics.moveTo(mouseX
-110, mouseY);
}
function P_Move(event:MouseEvent):
void {
    P_line.graphics.lineTo(mouseX
-110, mouseY);
}
function P_Up(event:MouseEvent):
void {
    removeEventListener(MouseEvent.MOUSE_MOVE, P_Move);
}
Paint_it();
///////////////////////////////////////////////////////////
//以下代码请写到SWFKit的Scripts里Items的Initialize内:
////////////////////////////////////////////////////////////

//Initialize
//getAdditionalFile();
//return true;
function saveByte(file) {
    var converter 
= new Base64();
    var newStream 
= converter.decode(file);
    var dlg 
= new Dialogs;
    var output 
= dlg.fileSave("JPG Files(*.jpg)|*.jpg|All Files(*.*)|*.*|""jpg","bitmap_jpg.jpg");
    newStream.saveToFile(output);
}
function Base64()
{
   
this.keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
   function readByte(input)
   {
      var ch 
= input.get();
      
if (input.eof) return NaN;      
      
return ch;
   }
   function encode(input) 
      {
       var output 
= new StringStream;
       var chr1, chr2, chr3 ;
       var enc1, enc2, enc3, enc4;
       
do 
       {
         chr1 
= this.readByte(input);
         chr2 
= this.readByte(input);
         chr3 
= this.readByte(input);
         enc1 
= chr1 >> 2;
         enc2 
= ((chr1 & 3<< 4| (chr2 >> 4);
         enc3 
= ((chr2 & 15<< 2| (chr3 >> 6);
         enc4 
= chr3 & 63;
         
if (isNaN(chr2)) 
         {
            enc3 
= enc4 = 64;
         } 
         
else if (isNaN(chr3)) 
         {
            enc4 
= 64;
         }
         output.write(
this.keyStr.charAt(enc1) + this.keyStr.charAt(enc2) + 
               
this.keyStr.charAt(enc3) + this.keyStr.charAt(enc4));               
         } 
while (!input.eof);
         
return output;
     }
     function decode(input) 
      {
         var output 
= new StringStream;
         var chr1, chr2, chr3;
         var enc1, enc2, enc3, enc4;
         var i 
= 0;
         
         var base64test 
= new RegExp("[^A-Za-z0-9+/=]""g");
         
if (base64test.exec(input)) 
         {
            trace(
"Base64.decode: ""invalid input string");
            
return null;
         } 
         
do 
         {
            enc1 
= this.keyStr.indexOf(input.charAt(i++));
            enc2 
= this.keyStr.indexOf(input.charAt(i++));
            enc3 
= this.keyStr.indexOf(input.charAt(i++));
            enc4 
= this.keyStr.indexOf(input.charAt(i++));
            
            chr1 
= (enc1 << 2| (enc2 >> 4);
            chr2 
= ((enc2 & 15<< 4| (enc3 >> 2);
            chr3 
= ((enc3 & 3<< 6| enc4;
            
            output.put(String.fromCharCode(chr1));
            
            
if (enc3 != 64
            {
               output.put(String.fromCharCode(chr2));
            }            
            
if (enc4 != 64
            {
               output.put(String.fromCharCode(chr3));
            }
         } 
while (i < input.length);
         
return output;
   }