我有一个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
精灵,这会改变视频的外观,如亮度,对比度,饱和度等,但在保存到服务器时,保存的图像不包含我已应用的过滤器。
我尝试将过滤器重新应用到bitmap
,graphicsData
和bitmap.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}
答案 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