Не удается использовать ImageSnapshot.captureBitmapData с матрицей вращения - PullRequest
2 голосов
/ 08 февраля 2009

У кого-нибудь есть пример использования функции 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));

Спасибо!

1 Ответ

3 голосов
/ 08 февраля 2009

Я только что смог воспроизвести это, так что это действительно похоже на ошибку в классе ImageSnapshot. Все, что я могу думать, это то, что он просто не был протестирован с использованием Матрицы вращения, поэтому он был полностью пропущен. Очевидно, что попытка создать bitmapData менее 1x1 является причиной, по которой он выдает ошибку. Честно говоря, не могу показаться вокруг этого.

Возможно, вам лучше всего создать собственный упрощенный класс моментальных снимков или просто использовать идентификационную матрицу, чтобы получить исходное растровое изображение, а затем скопировать его в новое растровое изображение, которое может содержать повернутую версию.

Редактировать

на другой ноте ... поскольку компоненты вспышки регистрируются в правом верхнем углу, вам также необходимо перевести матрицу по первоначальной высоте. Хотя, возможно, это решило первоначальную проблему, но она все еще ломается. Вот решение, которое использует новый 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>
...