[actionscript3]
package {
import flash.display.Loader;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.ContextMenuEvent;
import flash.events.Event;
import flash.net.FileReference;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.ui.ContextMenu;
import flash.ui.ContextMenuItem;
import flash.utils.ByteArray;
/**
* …
* @author Focus1921
* 實作Flash右鍵另存圖檔demo
*/
[SWF(width = "800", height = "600", backgroundColor = "#ffffff", frameRate = "30")]
public class Main extends Sprite {
private var imgDataLdr:URLLoader;
private var imgRequest:URLRequest;
private var imgData:ByteArray;
private var imgLdr:Loader;
private var imgSprite:Sprite;
private var imgFileRef:FileReference;
private var imgContextMenu:ContextMenu;
/**
* 建構式
*/
public function Main() {
if (stage) {
init();
}else {
addEventListener(Event.ADDED_TO_STAGE, init);
}
}
//—Method———————————————————————————————-
//初始化
private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
//舞台不縮放,靠上對齊
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
//加上demo浮水印
var _demoMark:DemoMark = new DemoMark(stage.stageWidth);
addChild(_demoMark);
//建構URLRequest,並指定目標圖檔url
imgRequest = new URLRequest();
imgRequest.url = "assets/p1.jpg";
//建構URLLoader,讀取目標圖檔二進位資料
imgDataLdr = new URLLoader();
imgDataLdr.dataFormat = URLLoaderDataFormat.BINARY;
imgDataLdr.addEventListener(Event.COMPLETE, onImgDataLdrComplete);
imgDataLdr.load(imgRequest);
//建構Sprite裝載圖檔Loader(Loader不能自訂右鍵快顯選單)
imgSprite = new Sprite();
addChild(imgSprite);
imgSprite.y = _demoMark.y + _demoMark.height;
//建構圖檔Loader,置於imgSprite顯示清單下
imgLdr = new Loader();
imgSprite.addChild(imgLdr);
//建構FileReference,存圖檔用
imgFileRef = new FileReference();
//建置圖檔Sprite容器自訂右鍵選單
setupImgMenu();
}
//建置圖檔Sprite容器自訂右鍵選單
private function setupImgMenu():void {
//建構自訂ContextMenu,關閉預設選項
imgContextMenu = new ContextMenu();
imgContextMenu.hideBuiltInItems();
//建構"另存圖片…"ContextMenuItem,加入自訂快顯選單中並將自訂選單指定給圖檔Sprite容器
var _itemSaveAs:ContextMenuItem = new ContextMenuItem("另存圖片…");
_itemSaveAs.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, onItemSaveAsSelect);
imgContextMenu.customItems.push(_itemSaveAs);
imgSprite.contextMenu = imgContextMenu;
}
//—Event Handler—————————————————————————————
//圖檔URLLoader讀取完成
private function onImgDataLdrComplete(e:Event):void {
//儲存圖檔二進位資料,圖檔Loader讀取該二進位資料(顯示用)
imgData = imgDataLdr.data;
imgLdr.loadBytes(imgData);
}
//快顯選單"另存圖片…"選項被選中
private function onItemSaveAsSelect(e:ContextMenuEvent):void {
//從Request的url中抓取圖檔檔名當作存檔預設檔名,叫用FileReference的save方法存檔
var _url:String = imgRequest.url;
var _defalutName:String = _url.substr(_url.lastIndexOf("/") + 1);
imgFileRef.save(imgData, _defalutName);
}
}
}
import flash.display.GradientType;
import flash.display.Sprite;
import flash.geom.Matrix;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
//demo浮水印
class DemoMark extends Sprite {
public function DemoMark(_width:Number) {
var _matrix:Matrix = new Matrix();
_matrix.createGradientBox(_width, 20);
graphics.beginGradientFill(GradientType.LINEAR, [0x333333, 0x333333], [1, 0], [0, 255], _matrix);
graphics.drawRect(0, 0, _width, 20);
graphics.endFill();
var _txt:TextField = new TextField();
_txt.autoSize = TextFieldAutoSize.LEFT;
_txt.textColor = 0xffffff;
_txt.text = "Flash實作右鍵另存圖片, demo by focus1921–(圖檔上按右鍵/另存圖片…)";
addChild(_txt);
_txt.x = _txt.y = 2;
}
}
[/actionscript3]
引用:
http://asgrocery.blogspot.com/2010/01/flash-with-fp10-api-filereferencesave.html#links
right click 另存圖片!
存檔時是把load進來的圖檔二進位資料原封不動寫回本機存檔,不會有轉存後品質和原圖不一樣的情況,如果圖檔要加工像是畫畫、加印章或是壓縮圖檔…等等的,就先建構BitmapData去draw加工過的圖後,再用JPGEncoder去編成ByteArray,最後交給FileReference.save()存檔。聽起來落落長,不過本篇的重點還是在於讓Flash擁有像是在網頁上圖片右鍵另存的功能。