Apache flex Flex:保存具有应用效果的mx:图像

Apache flex Flex:保存具有应用效果的mx:图像,apache-flex,actionscript-3,Apache Flex,Actionscript 3,我加载图像来控制,然后应用一些效果,当我保存图像时,它保存时没有效果。我该怎么办 代码如下: private var byteArr2:ByteArray; private var fileRef:FileReference = new FileReference(); public function process():void { var ct:ColorTransform = new ColorTransform(); ct.redOffset = 9

我加载图像来控制,然后应用一些效果,当我保存图像时,它保存时没有效果。我该怎么办

代码如下:

private var byteArr2:ByteArray;
private var fileRef:FileReference = new FileReference(); 

public function process():void
{
        var ct:ColorTransform = new  ColorTransform();
        ct.redOffset = 99;
        ct.blueOffset = 11;
            ct.greenOffset = 22;
            currImg.transform.colorTransform = ct;
            callLater(toByteArray);
}

public function toByteArray():void
{
        var data:BitmapData = new BitmapData(currImg.width, currImg.width);
        data.draw(currImg);             
        var encod:JPEGEncoder = new JPEGEncoder(100);               
        byteArr2 = encod.encode(data);
}
public function saveFile():void 
{  
        fileRef.save(byteArr2,"NewFileName1.jpg");
} 
<mx:HBox>       
        <mx:VBox>           
            <s:Button x="69" y="98" label="open" click="open()()"/>
            <s:Button label="show" click="show()"/> 
            <s:Button label="process" click="process()"/>   
            <s:Button label="save" click="saveFile()"/> 
        </mx:VBox>
        <mx:Image id="currImg" width="200" height="300"/>
    </mx:HBox>
更新在我使用var数据时出现新问题:BitmapData=new BitmapDatacurrImg.width,currImg.width;保存的图像和图像控件一样小,但我需要用原始大小保存图像。
使用var数据:BitmapData=BitmapcurrImg.content.BitmapData;它起作用了

我会将组件绘制到一个新的BitmapData对象中,而不是使用当前的内容。这将为您提供屏幕上绘制的内容,而不是未修改的内容。大概是这样的:

var data:BitmapData = new BitmapData(currImg.width, currImg.width);
data.draw(currImg);

希望这会有所帮助。

好吧,这不是一个很好的解决方案,因为我不知道为什么它会起作用,但是如果你在图像周围放置一个容器,然后保存它似乎起作用的绘图结果

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            import mx.graphics.codec.JPEGEncoder;
            private var byteArr2:ByteArray;
            private var fileRef:FileReference = new FileReference(); 

            public function process():void
            {
                var ct:ColorTransform = new  ColorTransform();
                ct.redOffset = 99;
                ct.blueOffset = 11;
                ct.greenOffset = 22;
                currImg.transform.colorTransform = ct;
                callLater(toByteArray);
            }

            public function toByteArray():void
            {
                var data:BitmapData = new BitmapData(everything.width, everything.width);
                data.draw(everything);             
                var encod:JPEGEncoder = new JPEGEncoder(100);               
                byteArr2 = encod.encode(data);
            }
            public function saveFile():void 
            {  
                fileRef.save(byteArr2,"NewFileName1.jpg");
            } 
        ]]>
    </fx:Script>
    <mx:HBox>       
        <mx:VBox>           
            <!--<s:Button x="69" y="98" label="open" click="open()"/>-->
            <!--<s:Button label="show" click="show()"/> -->
            <s:Button label="process" click="process()"/>   
            <s:Button label="save" click="saveFile()"/> 
        </mx:VBox>
        <mx:Box id="everything">
            <mx:Image id="currImg" width="200" height="300" source="http://www.google.com/images/logos/ps_logo2.png"/>
        </mx:Box>
    </mx:HBox>
</s:Application>

Shaun

+措辞巧妙的问题和良好的代码示例。不幸的是,我没有答案给你。这很奇怪,但问题仍然是方法按顺序被调用,换句话说,在调用编码/保存之前,事件队列是否会被清空?如果没有,callLater可能仍然对您有帮助。您是否尝试过在拍摄快照后对bitmapdata对象应用筛选器,而不是在图像组件上使用转换?ColorMatrixFilter可以实现您想要实现的目标吗?还可以使用BitmapData.ColorTransform将ColorTransform对象应用于BitmapData。draw方法接受矩阵作为可选的第二个参数,您应该能够使用该参数进行缩放。例如BitmapData.drawcurrImg,新矩阵2,0,0,2//比例尺x2。阅读关于draw方法的文档,它解释了为什么应用于源的转换不会被绘制。它将源代码视为库符号,图像控件上的scaleX和scaleY属性是什么?将其乘以图像控件宽度/高度或内容宽度/高度。你应该在某个地方得到正确的价值观。另外,我建议将图像控件的MaintaintAspectRatio属性设置为true。我仍然不确定是否准确,但似乎对图像内容的位图数据调用.colorTransformrect,img也可以,而不是将其包装,但是,无论出于何种原因,当颜色变换应用于图像的变换时,它都会以某种方式出现在它自己的对象中,而该对象不是文档中图像的子对象,它看起来就像只是修改位图数据的像素,但它似乎不是这样