|
有這樣一些應(yīng)用:用戶在Flash中編輯照片,將編輯后的圖片使用WEB SERVICE發(fā)送到服務(wù)器. 在AS2.0中,要實(shí)現(xiàn)這個功能非常麻煩,需要逐像素點(diǎn)處理圖片,然后生產(chǎn)可讀字符串,傳送到服務(wù)器上。 在AS3.0中,加入了ByteArray對象,使一切都變得簡單方便多了
首先需要2個AS類 PNGEncoder 和Base64 前者在Adobe網(wǎng)站上可以找到, 后者是開源的
PNGEncoder
/**/
/*
????Adobe?Systems?Incorporated(r)?Source?Code?License?Agreement
????Copyright(c)?2005?Adobe?Systems?Incorporated.?All?rights?reserved.
????
????Please?read?this?Source?Code?License?Agreement?carefully?before?using
????the?source?code.
????
????Adobe?Systems?Incorporated?grants?to?you?a?perpetual,?worldwide,?non-exclusive,?
????no-charge,?royalty-free,?irrevocable?copyright?license,?to?reproduce,
????prepare?derivative?works?of,?publicly?display,?publicly?perform,?and
????distribute?this?source?code?and?such?derivative?works?in?source?or?
????object?code?form?without?any?attribution?requirements.??
????
????The?name?"Adobe?Systems?Incorporated"?must?not?be?used?to?endorse?or?promote?products
????derived?from?the?source?code?without?prior?written?permission.
????
????You?agree?to?indemnify,?hold?harmless?and?defend?Adobe?Systems?Incorporated?from?and
????against?any?loss,?damage,?claims?or?lawsuits,?including?attorney's?
????fees?that?arise?or?result?from?your?use?or?distribution?of?the?source?
????code.
????
????THIS?SOURCE?CODE?IS?PROVIDED?"AS?IS"?AND?"WITH?ALL?FAULTS",?WITHOUT?
????ANY?TECHNICAL?SUPPORT?OR?ANY?EXPRESSED?OR?IMPLIED?WARRANTIES,?INCLUDING,
????BUT?NOT?LIMITED?TO,?THE?IMPLIED?WARRANTIES?OF?MERCHANTABILITY?AND?FITNESS
????FOR?A?PARTICULAR?PURPOSE?ARE?DISCLAIMED.??ALSO,?THERE?IS?NO?WARRANTY?OF?
????NON-INFRINGEMENT,?TITLE?OR?QUIET?ENJOYMENT.??IN?NO?EVENT?SHALL?MACROMEDIA
????OR?ITS?SUPPLIERS?BE?LIABLE?FOR?ANY?DIRECT,?INDIRECT,?INCIDENTAL,?SPECIAL,
????EXEMPLARY,?OR?CONSEQUENTIAL?DAMAGES?(INCLUDING,?BUT?NOT?LIMITED?TO,?
????PROCUREMENT?OF?SUBSTITUTE?GOODS?OR?SERVICES;?LOSS?OF?USE,?DATA,?OR?PROFITS;
????OR?BUSINESS?INTERRUPTION)?HOWEVER?CAUSED?AND?ON?ANY?THEORY?OF?LIABILITY,?
????WHETHER?IN?CONTRACT,?STRICT?LIABILITY,?OR?TORT?(INCLUDING?NEGLIGENCE?OR?
????OTHERWISE)?ARISING?IN?ANY?WAY?OUT?OF?THE?USE?OF?THIS?SOURCE?CODE,?EVEN?IF
????ADVISED?OF?THE?POSSIBILITY?OF?SUCH?DAMAGE.
*/
package?com

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

????
public
?
class
?PNGEncoder
 ????
{
 ????????
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);
????????}
????}
}
Base64
/**/
/*
*********************************************************\?
|??????????????????????????????????????????????????????????|?
|?The?implementation?of?PHPRPC?Protocol?3.0????????????????|?
|??????????????????????????????????????????????????????????|?
|?Base64.as????????????????????????????????????????????????|?
|??????????????????????????????????????????????????????????|?
|?Release?3.0.0????????????????????????????????????????????|?
|?Copyright?(c)?2005-2007?by?Team-PHPRPC???????????????????|?
|??????????????????????????????????????????????????????????|?
|?WebSite:??
http://www.phprpc.org/
?????????????????????????|?
|???????????
http://www.phprpc.net/
?????????????????????????|?
|???????????
http://www.phprpc.com/
?????????????????????????|?
|???????????
http://sourceforge.net/projects/php-rpc/
???????|?
|??????????????????????????????????????????????????????????|?
|?Authors:??Ma?Bingyao?<andot@ujn.edu.cn>??????????????????|?
|??????????????????????????????????????????????????????????|?
|?This?file?may?be?distributed?and/or?modified?under?the???|?
|?terms?of?the?GNU?Lesser?General?Public?License?(LGPL)????|?
|?version?3.0?as?published?by?the?Free?Software?Foundation?|?
|?and?appearing?in?the?included?file?LICENSE.??????????????|?
|??????????????????????????????????????????????????????????|?
\*********************************************************
*/
?

/**/
/*
?Base64?library?for?ActionScript?3.0.?
*?
*?Copyright?(C)?2007?Ma?Bingyao?<andot@ujn.edu.cn>?
*?Version:?1.1?
*?LastModified:?Oct?26,?2007?
*?This?library?is?free.??You?can?redistribute?it?and/or?modify?it.?
*/
?

/**/
/*
?
*?interfaces:?
*?import?org.phprpc.util.Base64;?
*?import?flash.utils.ByteArray;?
*?var?data:ByteArray?=?new?ByteArray();?
*?data.writeUTFBytes("Hello?PHPRPC");?
*?var?b64:String?=?Base64.encode(data);?
*?trace(b64);?
*?trace(Base64.decode(b64));?
*/
?
??
 package?com
{?
????import?flash.utils.ByteArray;?
 ????
public
?
class
?Base64?
{?
????????
private
?
static
??
const
?encodeChars:Array?
=
?
????????[
'
A
'
,
'
B
'
,
'
C
'
,
'
D
'
,
'
E
'
,
'
F
'
,
'
G
'
,
'
H
'
,?
????????
'
I
'
,
'
J
'
,
'
K
'
,
'
L
'
,
'
M
'
,
'
N
'
,
'
O
'
,
'
P
'
,?
????????
'
Q
'
,
'
R
'
,
'
S
'
,
'
T
'
,
'
U
'
,
'
V
'
,
'
W
'
,
'
X
'
,?
????????
'
Y
'
,
'
Z
'
,
'
a
'
,
'
b
'
,
'
c
'
,
'
d
'
,
'
e
'
,
'
f
'
,?
????????
'
g
'
,
'
h
'
,
'
i
'
,
'
j
'
,
'
k
'
,
'
l
'
,
'
m
'
,
'
n
'
,?
????????
'
o
'
,
'
p
'
,
'
q
'
,
'
r
'
,
'
s
'
,
'
t
'
,
'
u
'
,
'
v
'
,?
????????
'
w
'
,
'
x
'
,
'
y
'
,
'
z
'
,
'
0
'
,
'
1
'
,
'
2
'
,
'
3
'
,?
????????
'
4
'
,
'
5
'
,
'
6
'
,
'
7
'
,
'
8
'
,
'
9
'
,
'
+
'
,
'
/
'
];?
????????
private
?
static
??
const
?decodeChars:Array?
=
?
????????[
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
????????
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
????????
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
????????
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
????????
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
????????
-
1
,?
-
1
,?
-
1
,?
62
,?
-
1
,?
-
1
,?
-
1
,?
63
,?
????????
52
,?
53
,?
54
,?
55
,?
56
,?
57
,?
58
,?
59
,?
????????
60
,?
61
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
????????
-
1
,??
0
,??
1
,??
2
,??
3
,??
4
,??
5
,??
6
,?
?????????
7
,??
8
,??
9
,?
10
,?
11
,?
12
,?
13
,?
14
,?
????????
15
,?
16
,?
17
,?
18
,?
19
,?
20
,?
21
,?
22
,?
????????
23
,?
24
,?
25
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
????????
-
1
,?
26
,?
27
,?
28
,?
29
,?
30
,?
31
,?
32
,?
????????
33
,?
34
,?
35
,?
36
,?
37
,?
38
,?
39
,?
40
,?
????????
41
,?
42
,?
43
,?
44
,?
45
,?
46
,?
47
,?
48
,?
????????
49
,?
50
,?
51
,?
-
1
,?
-
1
,?
-
1
,?
-
1
,?
-
1
];?
 ????????
public
?
static
?function?encode(data:ByteArray):String?
{?
????????????var?
out
:Array?
=
?[];?
????????????var?i:
int
?
=
?
0
;?
????????????var?j:
int
?
=
?
0
;?
????????????var?r:
int
?
=
?data.length?
%
?
3
;?
????????????var?len:
int
?
=
?data.length?
-
?r;?
????????????var?c:
int
;?
 ????????????
while
?(i?
<
?len)?
{?
????????????????c?
=
?data[i
++
]?
<<
?
16
?
|
?data[i
++
]?
<<
?
8
?
|
?data[i
++
];?
????????????????
out
[j
++
]?
=
?encodeChars[c?
>>
?
18
]?
+
?encodeChars[c?
>>
?
12
?
&
?
0x3f
]?
+
?encodeChars[c?
>>
?
6
?
&
?
0x3f
]?
+
?encodeChars[c?
&
?
0x3f
];?
????????????}
?
 ????????????
if
?(r?
==
?
1
)?
{?
????????????????c?
=
?data[i
++
];?
????????????????
out
[j
++
]?
=
?encodeChars[c?
>>
?
2
]?
+
?encodeChars[(c?
&
?
0x03
)?
<<
?
4
]?
+
?
"
==
"
;?
????????????}
?
 ????????????
else
?
if
?(r?
==
?
2
)?
{?
????????????????c?
=
?data[i
++
]?
<<
?
8
?
|
?data[i
++
];?
????????????????
out
[j
++
]?
=
?encodeChars[c?
>>
?
10
]?
+
?encodeChars[c?
>>
?
4
?
&
?
0x3f
]?
+
?encodeChars[(c?
&
?
0x0f
)?
<<
?
2
]?
+
?
"
=
"
;?
????????????}
?
????????????
return
?
out
.join(
''
);?
????????}
?
 ????????
public
?
static
?function?decode(str:String):ByteArray?
{?
????????????var?c1:
int
;?
????????????var?c2:
int
;?
????????????var?c3:
int
;?
????????????var?c4:
int
;?
????????????var?i:
int
;?
????????????var?len:
int
;?
????????????var?
out
:ByteArray;?
????????????len?
=
?str.length;?
????????????i?
=
?
0
;?
????????????
out
?
=
?
new
?ByteArray();?
 ????????????
while
?(i?
<
?len)?
{?
????????????????
//
?c1?
????????????????
do
?
{?
????????????????????c1?
=
?decodeChars[str.charCodeAt(i
++
)?
&
?
0xff
];?
????????????????}
?
while
?(i?
<
?len?
&&
?c1?
==
?
-
1
);?
 ????????????????
if
?(c1?
==
?
-
1
)?
{?
????????????????????
break
;?
????????????????}
?
????????????????
//
?c2????
????????????????
do
?
{?
????????????????????c2?
=
?decodeChars[str.charCodeAt(i
++
)?
&
?
0xff
];?
????????????????}
?
while
?(i?
<
?len?
&&
?c2?
==
?
-
1
);?
 ????????????????
if
?(c2?
==
?
-
1
)?
{?
????????????????????
break
;?
????????????????}
?
????????????????
out
.writeByte((c1?
<<
?
2
)?
|
?((c2?
&
?
0x30
)?
>>
?
4
));?
????????????????
//
?c3?
????????????????
do
?
{?
????????????????????c3?
=
?str.charCodeAt(i
++
)?
&
?
0xff
;?
 ????????????????????
if
?(c3?
==
?
61
)?
{?
????????????????????????
return
?
out
;?
????????????????????}
?
????????????????????c3?
=
?decodeChars[c3];?
????????????????}
?
while
?(i?
<
?len?
&&
?c3?
==
?
-
1
);?
 ????????????????
if
?(c3?
==
?
-
1
)?
{?
????????????????????
break
;?
????????????????}
?
????????????????
out
.writeByte(((c2?
&
?
0x0f
)?
<<
?
4
)?
|
?((c3?
&
?
0x3c
)?
>>
?
2
));?
????????????????
//
?c4?
????????????????
do
?
{?
????????????????????c4?
=
?str.charCodeAt(i
++
)?
&
?
0xff
;?
 ????????????????????
if
?(c4?
==
?
61
)?
{?
????????????????????????
return
?
out
;?
????????????????????}
?
????????????????????c4?
=
?decodeChars[c4];?
????????????????}
?
while
?(i?
<
?len?
&&
?c4?
==
?
-
1
);?
 ????????????????
if
?(c4?
==
?
-
1
)?
{?
????????????????????
break
;?
????????????????}
?
????????????????
out
.writeByte(((c3?
&
?
0x03
)?
<<
?
6
)?
|
?c4);?
????????????}
?
????????????
return
?
out
;?
????????}
?
????}
?
}
下面的代碼就很簡單了,首先獲取到BitmapData對象,然后用PNGEncoder編碼壓縮一次,再用Base64編碼得到可讀字符串,然后通過WEB SERVICE發(fā)送到服務(wù)器 ????var?objBitmap:BitmapData?=?new?BitmapData(?mcPlaceHolder.width
???????????????????????????????????????????????,?mcPlaceHolder.height
???????????????????????????????????????????????,true
???????????????????????????????????????????????,0
???????????????????????????????????????????????);
????objBitmap.draw(mcPlaceHolder)
????var?bytes:ByteArray?=?PNGEncoder.encode(objBitmap);???
????//trace(?Base64.encode(bytes)?);
????
????var?paramObj:Object?=?LoaderInfo(this.root.loaderInfo).parameters;

????var?ws:WebService?=?new?WebService(paramObj["WebSvcPath"]);
????ws.onLoad?=?function(e)
 ???? {
????????trace(this.getWsInfo());
????}
????ws.onError?=?function(e)
 ???? {
????????trace(e.toString());
????}
????

????var?sr:EventDispatcher?=?ws.call("TestUpdate",?Base64.encode(bytes));
????sr.addEventListener("complete",?completeHandler);
????sr.addEventListener("error",?errorHandler);

????function?errorHandler(e)
 ???? {
?????????
????}
????function?completeHandler(e)
 ???? {
?????????trace("-------------------------");
?????????trace("TestUpdate?xml:");
?????????trace(e.xml);
?????????
?????????trace("-------------------------");
?????????trace("TestUpdate?data:");
?????????trace(e.data);
????}
|