【问题标题】:How to save Image with its original size?如何以原始大小保存图像?
【发布时间】:2011-08-20 21:58:27
【问题描述】:

在我的 Flex 应用程序中,我将图像加载到 Image 控件中。加载图像后,我可以应用颜色变换或灰度等滤镜,然后我想保存应用了滤镜的图像。我无法保存应用了过滤器的图像。使用以下代码,图像在没有过滤器的情况下被保存。但是,如果我使用

最终图像数据 = ImageSnapshot.captureBitmapData(myImage);

然后,图像会在应用过滤器的情况下保存,但会使用图像控件的尺寸。我想用原始尺寸保存图像。需要明确的是,如果图像是 1000px X 1000px 并显示在 300px X 300px 图像控件中,在保存时我仍然想以 1000px X 1000px 尺寸保存图像。怎么做?我也尝试过直接从下面的图像控件内容中获取 BitmapData,但这似乎不起作用。有帮助吗?

最终图像数据 = 位图(myImage.content).bitmapData;

            var filtersArray:Array = new Array;
            private var finalImagedata:BitmapData;

            private function loadImage(url:String):void
            {
                var request:URLRequest = new URLRequest(url);

                var imageLoader:Loader = new Loader();
                imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, image_completeHanlder);
                imageLoader.load(request);
            }
            private function image_completeHanlder(event:Event):void
            {
                var bmd:BitmapData = Bitmap(event.currentTarget.content).bitmapData;
                var bmpMy:Bitmap = new Bitmap(bmd);
                myImage.data=bmpMy;

            }
            protected function button1_clickHandler(event:MouseEvent):void
            {
                loadImage("http://localhost/main/image.jpg"); 
            }

            protected function prepareFinalImage():void
            {
                finalImagedata = new BitmapData(myImage.content.width, myImage.content.height, true);
                finalImagedata.draw (myImage.content);
            }
            protected function btnSave_clickHandler(event:MouseEvent):void
            {
                prepareFinalImage();

                var encoder:Object = new Object();
                var defaultName:String;

                        var je:*;
                        je = new JPGEncoder(100);
                        encoder.encode = je.encode;
                        defaultName = "myImage.jpg";


                var imageBytes:ByteArray = encoder.encode(finalImagedata);
                var fr:FileReference = new FileReference();
                fr.save(imageBytes,defaultName);
            }


            protected function btnGrayScale_clickHandler(event:MouseEvent):void
            {
                var red:Number = 0.3086; // luminance contrast value for red
                var green:Number = 0.694; // luminance contrast value for green
                var blue:Number = 0.0820; // luminance contrast value for blue
                var cmf1:ColorMatrixFilter = new ColorMatrixFilter([red, green, blue, 0, 0, red, green, blue, 0, 0, red, green, blue, 0, 0, 0, 0, 0, 1, 0]);
                filtersArray.push(cmf1);
                myImage.filters = filtersArray;
            }

【问题讨论】:

  • 您的意思是“如何将图像保存为原始大小”?如果不是,那么你应该去掉撇号,改写“如何以原始大小保存图像”

标签: apache-flex


【解决方案1】:

您应该将从Loader 检索到的位图数据存储为类成员:

private var bmd:BitmapData;
[...]
private function image_completeHanlder(event:Event):void
{
    bmd = Bitmap(event.currentTarget.content).bitmapData;
    var bmpMy:Bitmap = new Bitmap(bmd);
    myImage.data=bmpMy;
}

你的prepareFinalImage 方法应该依赖于加载的位图数据:

protected function prepareFinalImage():void
{
    finalImagedata = new BitmapData(bmd.width, bmd.height, true);
    if (myImage.filters.length > 0)
        finalImagedata.applyFilter(bmd, 
            new Rectangle(0, 0, bmd.width, bmd.height), 
            new Point(0,0), myImage.filters[0] as BitmapFilter);
    if (myImage.filters.length > 1)
        for (var i:int = 1; i < myImage.filters.length; i++)
        {
            finalImagedata.applyFilter(finalImagedata, 
                new Rectangle(0, 0, bmd.width, bmd.height), 
                new Point(0,0), myImage.filters[i] as BitmapFilter);
        }
}

这样您将在BitmapData 上应用过滤器,而不是在缩放后的DisplayObject 上。

【讨论】:

  • 我可能做错了什么,但我不断收到错误“TypeError: Error #2007: Parameter filterObject must be non-null.”当我调用 prepareFinalImage 时。即使在应用过滤器之后。
  • 你应该检查演员myImage.filters[i] as BitmapFilter是否是null。当然,应用精确的过滤器会更好,以便将它们放入myImage.filters 的数组中。
  • 这可能是问题所在。演员返回 null。我找到的解决方法是将过滤器直接应用于加载器加载的位图数据对象,然后在 Image 控件中显示该对象。这样,当我想保存最终图像时,我可以使用该位图数据保存它。不过,我不确定这是不是正确的方法。
猜你喜欢
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
相关资源
最近更新 更多