我希望在将图像转换为灰度图像后保存图像。但是我在转换后保存图像有问题。我通过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);
}
答案 0 :(得分:1)
我认为这是因为您将自定义过滤器应用于图像,然后保存bitmapData
。过滤器不会自行修改bitmapData
,这意味着Flash在绘制图像时会小心操作图像。可以想象这就像应用到Flash IDE中的模糊滤镜一样 - 它会使图像模糊,但它不会修改原始图像,对吗?
所以你只需要使用一个简单的draw
来获取修改后的BitmapData并使用它,类似于:
var modified:BitmapData = new BitmapData(original.width, original.heigth);
modified.draw(original);
var saver:BitmapSaver = new BitmapSaver(modified);
这应该可以解决问题,也许只需稍加调整即可。
修改强>: 正如@George Profenza在评论中提供的那样,还有另一个不错的选择。如果您不需要原始的BitmapData,则可以直接在其中设置过滤器,而不是显示对象。通过这种方式,原始源将被更改,并且使用任何类型的保护程序将直接执行此操作。请记住,您将无法撤消它。
无论如何,这是一个很好的方法,因为你不需要创建第二个BitmapData对象,这意味着你不会增加内存。
因此,根据原始BitmapData的需要,复制/克隆它,或直接使用过滤器。
干杯!