我的ByteArray没有保留过滤器

时间:2015-09-21 22:59:54

标签: actionscript-3

我有一个RTMP流,我需要截取屏幕截图。我使用bitmapData.draw()时出现安全错误,因为它来自AWS S3,因此我找到了一种解决方法,可以让我截取视频的屏幕截图:

var bitmap = new Bitmap();              
var graphicsData : Vector.<IGraphicsData>;
graphicsData = container.graphics.readGraphicsData(); //-- container is a sprite that holds my video element                
bitmap.bitmapData = GraphicsBitmapFill(graphicsData[0]).bitmapData;
var image:ByteArray = new JPGEncoder(85).encode(bitmap.bitmapData);

此时,我将ByteArray发送给PHP,从ByteArray创建JPG并将其保存到服务器。一切都很好。

问题是我将过滤器实时应用于container精灵,这会改变视频的外观,如亮度,对比度,饱和度等,但在保存到服务器时,保存的图像不包含我已应用的过滤器

我尝试将过滤器重新应用到bitmapgraphicsDatabitmap.bitmapData,但没有任何效果。

如何保留应用的过滤器或将过滤器重新应用于上述代码?

修改

以下是我最初应用过滤器的方法:

private function applyEffects(effects:Array):void
{
    currentEffects = effects;
    var props:Object = {};
    for (var i:String in effects)
    {
        props[effects[i].effect] = effects[i].amount;
    }
    TweenLite.to(container,0,{colorMatrixFilter:props});
}

props对象可能类似于:{contrast:0.5,saturation:1}

1 个答案:

答案 0 :(得分:0)

好的,我已经通过Jack Doyle(GSAP作者)给我的一点建议自己解决了这个问题。我在代码的评论中描述了我的不同之处:

var graphicsData:Vector.<IGraphicsData>;
graphicsData          = container.graphics.readGraphicsData();              
var origBitmap:Bitmap = new Bitmap();   
origBitmap.bitmapData = GraphicsBitmapFill(graphicsData[0]).bitmapData;

//-- at this point I have a screenshot of the video

var props:Object = {};
for (var i:String in currentEffects)
{
  props[currentEffects[i].effect] = currentEffects[i].amount;
}
TweenLite.to(origBitmap,0,{colorMatrixFilter:props});

//-- at this point I've reapplied the effects.
//-- originally, sending bitmap.bitmapData to the encoder didn't retain the filters so I went 1 step further

//-- create a new bitmapData and draw the reapplied filter'd bitmap
var filteredBitmapData:BitmapData = new BitmapData(640,360);
var filteredBitmap:Bitmap = new Bitmap(filteredBitmapData);
filteredBitmapData.draw(origBitmap);

//-- encode the new bitmap data
var image:ByteArray = new JPGEncoder(85).encode(filteredBitmapData); //-- filteredBitmapData is now filtered and I can send this to the server