将图像转换为灰度并通过自定义类BitmapSaver保存

时间:2014-06-15 06:50:34

标签: actionscript-3 flash bitmap

我希望在将图像转换为灰度图像后保存图像。但是我在转换后保存图像有问题。我通过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);
}

1 个答案:

答案 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的需要,复制/克隆它,或直接使用过滤器。

干杯!