在将图像转换为灰度图像后,我想保存它。但我有一个问题,保存图像后,转换它。我成功地通过as3将图像转换为灰度,但是当我用自定义类BitmapSaver保存这个修改过的图像时,保存的图像又是原始颜色而不是灰度。我不明白为什么会这样?如果有人知道这个问题,请帮助我.!谢谢.!!
import flash.display.Bitmap;
import flash.display.Loader;
import fl.controls.Button;
import flash.net.FileReference;
import flash.net.FileFilter;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.utils.ByteArray;
import fl.motion.AdjustColor;
import flash.filters.ColorMatrixFilter;
import com.flashandmath.dg.bitmapUtilities.BitmapSaver;
var imageFilter=new FileFilter("Images", "*.jpg;*.jpeg;*.gif;*.png");
var fileR:FileReference=new FileReference();
fileR.addEventListener(Event.SELECT, selectHandler);
fileR.addEventListener(Event.COMPLETE, completeHandler);
pickbutton.addEventListener(MouseEvent.CLICK,selectImage);
function selectImage(e:MouseEvent):void{
fileR.browse([imageFilter]);
}
function selectHandler(e:Event):void{
trace("selectHandler: "+fileR.name);
fileR.load();
}
function completeHandler(e:Event):void {
trace("completeHandler: " + fileR.name);
var ba:ByteArray=fileR.data;
var loader:Loader=new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loaded);
loader.loadBytes(ba);
}
var bm:Bitmap;
function loaded(e:Event):void{
bm = e.currentTarget.loader.content as Bitmap;
addChild(bm);
adjustColor();
}
function adjustColor():void
{
var ac:AdjustColor = new AdjustColor();
ac.brightness = 20;
ac.hue = 0;
ac.saturation = -100;
ac.contrast = 40;
var ar:Array = ac.CalculateFinalFlatArray();
var cl:ColorMatrixFilter = new ColorMatrixFilter(ar);
var filter:Array = new Array(cl);
bm.filters = filter;
var saver:BitmapSaver = new BitmapSaver(bm.bitmapData);
}发布于 2014-06-15 07:01:16
我认为这是因为您对图像应用了自定义过滤器,然后保存了bitmapData。过滤器不自行修改bitmapData,这意味着Flash在绘制图像时要小心操作它。想象一下,这就像一个应用在Flash中的模糊过滤器--它会使图像变得模糊,但是它不会修改原始图像,对吗?
因此,您只需要使用一个简单的draw来接受修改后的BitmapData并使用它,类似于这样:
var modified:BitmapData = new BitmapData(original.width, original.heigth);
modified.draw(original);
var saver:BitmapSaver = new BitmapSaver(modified);也许只要稍微调整一下就行了。
编辑:正如@George 在评论中提供的那样,还有另一个很好的选择。如果您不需要原始的BitmapData,您可以直接为它设置一个过滤器,而不是显示对象。通过这种方式,原始源将被更改,并且使用任何类型的保护程序都将直接完成这个任务。请记住,你将无法扭转它。
无论如何,这是一种很好的方法,因为您不需要创建第二个BitmapData对象,这意味着您不会增加内存。
因此,根据原始BitmapData的需要,要么复制/克隆它,要么直接在其上使用过滤器。
干杯!
https://stackoverflow.com/questions/24227240
复制相似问题