不能将ImageSnapshot.captureBitmapData与旋转矩阵一起使用

时间:2009-02-08 18:00:00

标签: flex bitmap rotation flex3 matrix

有没有人有使用带旋转矩阵的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));

谢谢!

1 个答案:

答案 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>