Flex, проблема при jpegencoding двух битовых карт в последовательности - PullRequest
0 голосов
/ 18 сентября 2010

Я создаю это «приложение для рисования», где пользователь может нажать «Предварительный просмотр», и он возьмет то, что он сделал, нарисует растровое изображение, а затем я хочу разделить это растровое изображение на левое и правое изображения.Я создаю первое растровое изображение, кодирую его в формате JPEG, а затем использую его, чтобы вырезать влево и вправо, используя copypixels.Затем я преобразовываю изображения вместе с промежутком между ними в одном холсте и рисую этот холст.Там все отлично работает.

Когда я иду, чтобы закодировать новое растровое изображение, а затем предлагаю сохранить его, сохраненное изображение остается пустым.Я проверил все до этого момента, и все работает отлично.Я вижу изображения на экране, я могу сохранить первое растровое изображение нормально ... но второе всегда пустое.Вот пример кода, возможно, кто-то может мне помочь.

_mainBmd = new BitmapData(_jacketWidth, _jacketHeight);
_mainBmd.draw(_imageHolder);
startEncode(_mainBmd);


private function startEncode(imageBitmapData:BitmapData):void 
        {
            var encoder:JPEGAsyncEncoder = new JPEGAsyncEncoder(100);
            encoder.PixelsPerIteration = 150;
            encoder.addEventListener(JPEGAsyncCompleteEvent.JPEGASYNC_COMPLETE, encodeDone);

            encoder.encode(imageBitmapData);


        }

private function encodeDone(event:JPEGAsyncCompleteEvent):void
        {

_leftBmd = new BitmapData(sideWidth, sideHeight);
            var lRect:Rectangle = new Rectangle(0,0, sideWidth, sideHeight);
            var lPoint:Point = new Point(0,0);
            _leftBmd.copyPixels(_mainBmd, lRect, lPoint);


            _rightBmd = new BitmapData(sideWidth, sideHeight);
            var bWidth:Number = 200;
            var sWidth:Number = 111;
            var rRectWidth:Number = (bWidth/2 + sWidth) *  Constants.print_dpi;
            var rRect:Rectangle = new Rectangle(rRectWidth, 0, sideWidth, sideHeight);
            var rPoint:Point = new Point(0, 0);
            _rightBmd.copyPixels(_mainBmd, rRect, rPoint);

var lbm:Bitmap = new Bitmap(_leftBmd);
            var rbm:Bitmap = new Bitmap(_rightBmd);

            //now combine the two images into one holder with a space in the middle 


            //left Image
            var l_Image:Image = new Image();
            l_Image.source = lbm;

            //right image
            var r_Image:Image = new Image();
            r_Image.source = rbm;

var newRender:Canvas = new Canvas();
            newRender.clipContent = false;
            newRender.minHeight = 0;
            newRender.minWidth = 0;

            newRender.addChild(l_Image);
            r_Image.x = 500;
            newRender.addChild(r_Image);

fcBMD = new BitmapData(renderW, renderH);
            fcBMD.draw(newRender);

startEncode2(fcBMD);


}

private function startEncode2(imageBitmapData:BitmapData):void 
        {
            var encoder:JPEGAsyncEncoder = new JPEGAsyncEncoder(100);
            encoder.PixelsPerIteration = 150;
            encoder.addEventListener(JPEGAsyncCompleteEvent.JPEGASYNC_COMPLETE, encode2Done);

            encoder.encode(imageBitmapData);


        }

private function encode2Done(event:JPEGAsyncCompleteEvent):void
        {
            _data  = event.ImageData;


        }

private function onSaveRenderClick(e:MouseEvent):void  //save button listener
        {
            var fileRef:FileReference = new FileReference();
            fileRef.addEventListener(Event.SELECT, onSaveComplete);
            fileRef.save(_data, 'testImage.jpg');
        }

1 Ответ

0 голосов
/ 18 сентября 2010

Есть ли особая причина, по которой вы проходите все циклы создания холста и добавления изображений?

Почему бы не использовать copyPixels непосредственно для окончательных BitmapData, которые вы хотите кодировать:

var backgroundColor:uint = 0xffffff;
fcBMD = new BitmapData(renderW, renderH, false, backgroundColor);

var lPoint:Point = new Point(0,0);
var lRect:Rectangle = new Rectangle(0,0, sideWidth, sideHeight);
fcBMD.copyPixels(_mainBmd, lRect, lPoint);

var rRect:Rectangle = new Rectangle(rRectWidth, 0, sideWidth, sideHeight);
var rPoint:Point = new Point(renderW - sideWidth, 0);
fcBMD.copyPixels(_mainBmd, rRect, rPoint);

startEncode2(fcBMD);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...