2

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

我想要实现的是文本输入控件的旋转位图(我试图避免在应用程序中嵌入字体)。当我不旋转位图时,这段代码工作得很好,但我旋转它的那一刻,它就坏了。

接受后的答案编辑

我在原始问题中使用加载器类,并且我还想要文本 270 度 - 所以这是执行此操作的文本:

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));

谢谢!

4

1 回答 1

3

我刚刚能够重现这一点,所以它确实看起来像是 ImageSnapshot 类中的错误。我能想到的只是它没有使用旋转矩阵进行测试,所以它完全被遗漏了。显然,尝试创建小于 1x1 的 bitmapData 是它引发错误的原因。老实说,无论如何似乎都无法绕过它。

认为您最好的选择可能是创建自己的简化快照类,或者仅使用单位矩阵来获取原始位图,然后将其复制到可以容纳旋转版本的新 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>
于 2009-02-08T19:03:10.860 回答