有没有人有使用带旋转矩阵的ImageSnapshot.captureBitmapData函数的示例?这是我正在使用的代码:
var matrix:Matrix = new Matrix();
matrix.rotate(degreesToRadians(90));
var bitmapData:BitmapData = ImageSnapshot.captureBitmapData(textInput, matrix);
但不幸的是,这会在ImageSnapshot.as中的以下行引发错误:
data = new BitmapData(scaledWidth, scaledHeight, true, 0x00000000); // <-- THROWS ERROR HERE AS scaledWidth / scaledHeight are extremely small numbers (-1-e16 etc)
data.draw(source, matrix, colorTransform,
blendMode, clipRect, smoothing);
}
finally
{
if (source is IUIComponent)
finishPrintObject(IUIComponent(source), normalState); // <-- ERROR THROWN HERE, BUT CAUSE OF ERROR IS ABOVE
}
我想要实现的是文本输入控件的旋转位图(我试图避免在应用程序中嵌入字体)。当我不旋转位图时,这段代码工作得很好,但是当我旋转位图时,它会中断。
接受后 - 答案编辑
我在原始问题中使用了一个加载器类,我也希望文本270degrees - 所以这里的文本就是这样:
var matrix:Matrix = new Matrix();
matrix.rotate(Math.PI * 1.5);
matrix.translate(0, copyThis.width);
var bitmapData:BitmapData = ImageSnapshot.captureBitmapData(copyThis, new Matrix());
var rotatedBitmap : BitmapData = new BitmapData(bitmapData.height, bitmapData.width, false, 0xFFFF0000);
rotatedBitmap.draw(bitmapData, matrix);
loader.load(new Bitmap(rotatedBitmap));
谢谢!
答案 0 :(得分:3)
我刚刚能够重现这一点,所以它确实看起来像是ImageSnapshot类中的bug。我能想到的只是它没有使用旋转矩阵进行测试,所以它完全被遗漏了。显然,尝试创建一个小于1x1的bitmapData是它抛出错误的原因。不管怎么说,无论如何都不能说实话。
您认为最好的选择是创建自己的简化快照类,或者只使用单位矩阵来获取原始位图,然后将其复制到可容纳旋转版本的新位图数据中。
修改强>
另一个注意事项......由于闪光灯组件是从右上角注册的,因此您还需要将矩阵平移到原始高度。虽然这可能解决了原来的问题,但它仍然打破了。这是一个使用新BitmapData并转换ImageSnapshot
创建的解决方案的解决方案<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.graphics.ImageSnapshot;
private function clickHandler(event : MouseEvent) : void
{
var matrix:Matrix = new Matrix();
matrix.rotate(Math.PI / 2);
matrix.translate(copyThis.height, 0);
var bitmapData:BitmapData = ImageSnapshot.captureBitmapData(copyThis, new Matrix());
var rotatedBitmap : BitmapData = new BitmapData(bitmapData.height, bitmapData.width, false, 0xFFFF0000);
rotatedBitmap.draw(bitmapData, matrix);
var g : Graphics = copyTo.graphics;
g.clear();
g.beginBitmapFill(rotatedBitmap);
g.drawRect(0,0, rotatedBitmap.width, rotatedBitmap.height);
g.endFill();
}
]]>
</mx:Script>
<mx:VBox width="100%" height="100%" horizontalAlign="center">
<mx:Canvas width="100%" height="100%">
<mx:TextInput id="copyThis" text="COPY THIS" horizontalCenter="0" verticalCenter="0"/>
</mx:Canvas>
<mx:Canvas id="copyTo" width="100%" height="100%" />
<mx:Button id="copyIt" label="COPY IT" click="clickHandler(event)" />
</mx:VBox>
</mx:Application>