A Flash Developer Resource Site

Results 1 to 2 of 2

Thread: Poor quality of resized bitmap after FP update

  1. #1
    Junior Member
    Join Date
    Mar 2011
    Posts
    1

    Question Poor quality of resized bitmap after FP update

    Now, after my flash player update from 10.0 to 10.2.152, resized image quality is poor. Also quality depends on original image dimensions, even 1px difference in width or height for same user's original image for some reason can affect differently on quality of resized image.



    Actionscript Code:
    result = new FileWork(Bitmap(loader.content));

    Actionscript Code:
    package fgm
    {

        import flash.net.*;
        import flash.system.*;
        import flash.events.*;
        import flash.display.*;
        import flash.filters.*;
        import flash.utils.*;
        import flash.geom.*;
        import flash.external.*;
        import com.gskinner.geom.*;
        import com.jpeg.*;

        public class FileWork extends Object
        {

            private var _image:Bitmap;
            private var _resized:Bitmap;
            private var _resized_thumb:Bitmap;
            private var _resized_preview:Bitmap;
            private var _fn:Function;
            private var _postdata:PostData;
            private var upLoader:URLLoader;


            //*/
            public function FileWork(bm:Bitmap)
            {
                //
                _image = bm;
                _resized = new Bitmap();
                _resized_thumb = new Bitmap();
                _resized_preview = new Bitmap();
                //
            }
            //*/



            //*/
            public function set onComplete(functionInstance:Function):void
            {
                _fn = functionInstance;
            }
            //*/



            //*/
            private function imageDimensionsNonConformed():void
            {
                $.log.add("warning: image dimensions do not conformed.");
                $.status.view = 3;
            }
            //*/
           
           
           
            //*/
            private function resize():Bitmap
            {
                return ImageUtils.resize(_image, $.image_max_side, $.image_max_side);
            }
            //*/



            //*/
            private function resize_thumb():Bitmap
            {
                return ImageUtils.crop(_image, $.thumb_max_side, $.thumb_max_side);
            }
            //*/



            //*/
            private function resize_preview():Bitmap
            {
                return ImageUtils.resize(_image, $.preview_max_side, $.preview_max_side);
            }
            //*/



            //*/
            public function processImage():void
            {
                //*/
                _resized = (_image.width >= $.image_min_side) && (_image.height >= $.image_min_side) ? resize() : null;
                if (_resized == null)
                {
                    imageDimensionsNonConformed();
                    return;
                }
                _resized_thumb = resize_thumb();
                _resized_preview = resize_preview();
                //
                _image.bitmapData.dispose();
                //
                var saturation_tune_up:ColorMatrix = new ColorMatrix();
                saturation_tune_up.adjustColor(0, 0, $.image_saturation, 0);
                var saturation_tune_up_filter:ColorMatrixFilter = new ColorMatrixFilter(saturation_tune_up);
                var sharpen:ConvolutionFilter = new ConvolutionFilter(3,3,new Array(0,-1,0,-1,16,-1,0,-1,0),12);
                //
                var pt:Point = new Point(0,0);
                var rect:Rectangle = new Rectangle(0,0,_resized.width,_resized.height);
                _resized.bitmapData.applyFilter(_resized.bitmapData, rect, pt, saturation_tune_up_filter);
                _resized.bitmapData.applyFilter(_resized.bitmapData, rect, pt, sharpen);
                var rect_thumb:Rectangle = new Rectangle(0,0,_resized_thumb.width,_resized_thumb.height);
                _resized_thumb.bitmapData.applyFilter(_resized_thumb.bitmapData, rect_thumb, pt, saturation_tune_up_filter);
                _resized_thumb.bitmapData.applyFilter(_resized_thumb.bitmapData, rect_thumb, pt, sharpen);
                var rect_preview:Rectangle = new Rectangle(0,0,_resized_preview.width,_resized_preview.height);
                _resized_preview.bitmapData.applyFilter(_resized_preview.bitmapData, rect_preview, pt, saturation_tune_up_filter);
                _resized_preview.bitmapData.applyFilter(_resized_preview.bitmapData, rect_preview, pt, sharpen);
                //
                var startTimer:Number = getTimer();
                var encodeJPG:JPEGEncoder = new JPEGEncoder($.compression);
                var jpgByteArray:ByteArray = encodeJPG.encode(_resized.bitmapData);
                var jpgByteArray_thumb:ByteArray = encodeJPG.encode(_resized_thumb.bitmapData);
                var jpgByteArray_preview:ByteArray = encodeJPG.encode(_resized_preview.bitmapData);
                //
                prepareToUpload(jpgByteArray, jpgByteArray_thumb, jpgByteArray_preview);
            }
            //
    //
    //*/
    }
    }

    Actionscript Code:
    package fgm
    {
        import flash.display.*;
        import flash.geom.*;
        import flash.utils.*;

        public class ImageUtils extends Object
        {


            //*/
            public function ImageUtils()
            {
                return;
            }
            //*/



            //*/
            public static function resize(sourceBitmap:Bitmap, targetWidth:Number, targetHeight:Number):Bitmap
            {
                var startTimer:Number = getTimer();
                var scaleFactor:Number;
                var resizeMatrix:Matrix = new Matrix();
                var sourceBitmapData:BitmapData = sourceBitmap.bitmapData;

                if (sourceBitmapData.width <= targetWidth && sourceBitmapData.height <= targetHeight) scaleFactor = 1;
                else scaleFactor = Math.min(targetWidth / sourceBitmapData.width, targetHeight / sourceBitmapData.height);
                resizeMatrix.scale(scaleFactor, scaleFactor);

                var resultBitmapData:BitmapData = new BitmapData(Math.round(sourceBitmapData.width * scaleFactor), Math.round(sourceBitmapData.height * scaleFactor), false);
                resultBitmapData.draw(sourceBitmapData, resizeMatrix, null, null, null, true);

                return new Bitmap(resultBitmapData);
               
            }
            //*/



            //*/
            public static function crop(sourceBitmap:Bitmap, targetWidth:Number, targetHeight:Number):Bitmap
            {
                var startTimer:Number = getTimer();
                var scaleFactor:Number;
                var resizeMatrix:Matrix = new Matrix();
                var sourceBitmapData:BitmapData = sourceBitmap.bitmapData;
               
                var cropSize:Number = Math.min(sourceBitmapData.width, sourceBitmapData.height);
                var cropX:Number = Math.floor(Math.max(0, (sourceBitmapData.width - sourceBitmapData.height) / 2));
                var cropY:Number = Math.floor(Math.max(0, (sourceBitmapData.height - sourceBitmapData.width) / 2));
               
                if (cropSize <= targetWidth && cropSize <= targetHeight) scaleFactor = 1;
                else scaleFactor = Math.min(targetWidth / cropSize, targetHeight / cropSize);
                resizeMatrix.scale(scaleFactor, scaleFactor);
                resizeMatrix.translate(Math.ceil(-cropX * scaleFactor), Math.ceil( -cropY * scaleFactor));
               
                var resultBitmapData:BitmapData = new BitmapData(Math.round(cropSize * scaleFactor), Math.round(cropSize * scaleFactor), false);
                resultBitmapData.draw(sourceBitmapData, resizeMatrix, null, null, null, true);

                return new Bitmap(resultBitmapData);
            }
            //*/
           
           
           
            //*/
        }
    }

  2. #2
    Senior Member
    Join Date
    May 2010
    Location
    Russia: Western Siberia
    Posts
    268
    Вот код класса, который у меня в игре делает ресайз фона и создает на его основе уменьшенную карту:
    Actionscript Code:
    package game.tiler
    {
        import Broadcaster.Action;
        import fl.transitions.easing.Regular;
        import fl.transitions.Tween;
        import fl.transitions.TweenEvent;
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.DisplayObjectContainer;
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.geom.Matrix;
        import flash.geom.Point;
        import flash.geom.Rectangle;
       
        public class MiniMap extends Sprite
        {
            var bmd:BitmapData;
            var bm:Bitmap;
            var lowerLayer:Bitmap;
            var upperLayer:Bitmap;
            var maxWidth:Number = 640;
            var maxHeight:Number = 590;
            var imageScale:Number;
            var mapW:Number;
            var mapH:Number;
            var matrixX:Number;
            var matrixY:Number;
            var matrixScale:Number;
            var playerPosition:Point;
            var mainBitmapdata:BitmapData;
            var bg:Sprite;
            var action:Action; // передается в конструкторе, нужно для того чтобы снять игру с паузы когда карта убирается с экрана
            private var mapAlphaTween:Tween;
           
            public function MiniMap(parent:DisplayObjectContainer, lowerBitmap:Bitmap, upperBitmap:Bitmap, pointer:MovieClip, playerPosition:Point, controller:Action)
            {
                lowerLayer = lowerBitmap;
                upperLayer = upperBitmap;
                this.playerPosition = playerPosition;
                action = controller;
                var m:Matrix = new Matrix();
               
                if (lowerLayer.width > lowerLayer.height) // выбор параметров ширины и высоты для карты
                {  
                    imageScale = maxWidth / lowerBitmap.width;
                    matrixScale = imageScale - (imageScale / 100); // так как карта должна иметь белые поля по краям, матрица должна быть меньше фона
                    matrixX = ((lowerLayer.width * imageScale) - (lowerLayer.width * matrixScale)) / 2; //позиционирование матрицы по центру карты горизонтально
                    matrixY = ((lowerLayer.height * imageScale) - (lowerLayer.height * matrixScale)) / 2;
                }
                else
                {
                    imageScale = maxHeight / lowerBitmap.height;
                    matrixScale = imageScale - (imageScale / 100);
                    matrixX = ((lowerLayer.width * imageScale) - (lowerLayer.width * matrixScale)) / 2;
                    matrixY = ((lowerLayer.height * imageScale) - (lowerLayer.height * matrixScale)) / 2;
                }
               
               
                mainBitmapdata = new BitmapData(lowerLayer.width, lowerLayer.height, false, 0xFFFFFF);
                mainBitmapdata.copyPixels(lowerLayer.bitmapData, lowerLayer.getBounds(lowerLayer), new Point(lowerLayer.x, lowerLayer.y), null, null, true);
                mainBitmapdata.copyPixels(upperLayer.bitmapData, upperLayer.getBounds(upperLayer), new Point(upperLayer.x, upperLayer.y), null, null, true);
                var playerX:Number = playerPosition.x;
                var playerY:Number = playerPosition.y;
                var cross:BitmapData = new YourHere(110, 110); // крестик обозначающий позицию игрока
                var crossMatrix:Matrix = new Matrix();
                crossMatrix.scale(matrixScale > 0.5 ? matrixScale : 1, matrixScale > 0.5 ? matrixScale : 1);
                var crossBMD:BitmapData = new BitmapData(110, 110, true, 0x00000000);
                crossBMD.draw(cross, crossMatrix);
                mainBitmapdata.copyPixels(crossBMD, new Rectangle(0, 0, crossBMD.width, crossBMD.height), new Point(playerX - crossBMD.width / 2, playerY - crossBMD.height / 2), null, null, true);
               
               
                mapW = lowerLayer.width * imageScale;
                mapH = lowerLayer.height * imageScale;
               
                m.scale(matrixScale, matrixScale);
                m.tx = matrixX;
                m.ty = matrixY;
                bmd = new BitmapData(mapW, mapH, false, 0xD6D878);
                bmd.draw(mainBitmapdata, m, null, null, null, true);
                bm = new Bitmap(bmd, "auto", true);
                bm.alpha = 0;
                //---->>> создание черного фона под картой
                bg = new Sprite();
                bg.graphics.beginFill(0x000000, 0.6);
                bg.graphics.drawRect(0, 0, 650, 600);
                bg.x = 150;
                bg.y = 0;
                parent.addChild(bg);
                //----<<<
               
               
                this.addChild(bm);
               
                // создание сетки на карте >>>>
                var lineX:Number = Globals.TILE_DIM * matrixScale;
                var lineY:Number = Globals.TILE_DIM * matrixScale;
                var vertLine:Number = bm.height - 1;
                var horiLine:Number = bm.width - 1;
                var vLines:int = lowerLayer.width / Globals.TILE_DIM - 1
                var hLines:int = lowerLayer.height / Globals.TILE_DIM - 1
               
                var grid:Sprite = new Sprite();
                grid.graphics.lineStyle(1, 0xD6D878);
               
                for (var i:int = 0; i < vLines; i++)
                {
                    grid.graphics.moveTo(lineX, 0);
                    grid.graphics.lineTo(lineX, vertLine);
                    lineX += Globals.TILE_DIM * matrixScale;
                }
               
                for (var j:int = 0; j < hLines; j++)
                {
                    grid.graphics.moveTo(0, lineY);
                    grid.graphics.lineTo(horiLine, lineY);
                    lineY += Globals.TILE_DIM * matrixScale;
                }
                   
                this.addChild(grid);
                // создание сетки на карте <<<<
               
               
                mapAlphaTween = new Tween(bm, "alpha", Regular.easeOut, 0, 1, 1, true); // плавное появлени карты
                mapAlphaTween = new Tween(grid, "alpha", Regular.easeOut, 0, 0.3, 1, true); // плавное появлени карты
                mapAlphaTween.addEventListener(TweenEvent.MOTION_FINISH, letDisposition, false, 0, true);
                this.x = 400 - (mapW / 2) + 150 / 2;
                this.y = 300 - (mapH / 2)
                parent.addChild(this);
                pointer.parent.setChildIndex(pointer, pointer.parent.numChildren - 1);
               
                crossBMD.dispose();
                cross.dispose();
               
               
            }
           
            private function letDisposition(e:TweenEvent):void
            {
                e.currentTarget.removeEventListener(TweenEvent.MOTION_FINISH, letDisposition);
                this.addEventListener(MouseEvent.CLICK, disposeOfMap, false, 0, true);
            }
           
            private function disposeOfMap(e:MouseEvent):void
            {
                MissionConstructor.resetKeys();
                action.unpause();
                this.removeEventListener(MouseEvent.CLICK, disposeOfMap);
                bg.graphics.clear();
                this.parent.removeChild(bg);
                mainBitmapdata.dispose();
                bmd.dispose();
                if (this.parent.contains(this))
                {this.parent.removeChild(this);}
                MissionConstructor.letShowMap();
            }
            public function clearAll():void // для внешнего вызова. Например при принудительной постановке игры на паузу.
            {
                action.unpause();
                this.removeEventListener(MouseEvent.CLICK, disposeOfMap);
                bg.graphics.clear();
                if (this.parent.contains(bg))
                    this.parent.removeChild(bg);
                if (mainBitmapdata != null)
                    mainBitmapdata.dispose();
                if (bmd != null)
                    bmd.dispose();
                if (this.parent.contains(this))
                    this.parent.removeChild(this);
                MissionConstructor.letShowMap();
            }
        }
    }
    Надеюсь поможет

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  




Click Here to Expand Forum to Full Width

HTML5 Development Center