Что не так с этим куском кода? - PullRequest
0 голосов
/ 04 сентября 2011

Я пытаюсь создать графический редактор во Flex 4.5.

Однако есть одна маленькая вещь, которая не работает должным образом.Вот мой код:

            private function returnCropIndicatorBmpDataForTopLeft():BitmapData{

            var topLeftX:int     = 0;
            var topLeftY:int     = 0;

            var topRightX:int    = _bmpData.width;
            var topRightY:int    = 0;

            var bottomRightX:int = _bmpData.width;
            var bottomRightY:int = _bmpData.height;

            var bottomLeftX:int  = 0;
            var bottomLeftY:int  = _bmpData.height;

            var cropIconX:int    = _mouseX;
            var cropIconY:int    = _mouseY;

            var temporaryBitmapData:BitmapData = _bmpData;

            var originalColor:uint;
            var dimmedColor:uint = 0x202020;

            for (var i:int = 0; i < _bmpData.width; i++) 
            {
                for (var j:int = 0; j < _bmpData.height; j++) 
                {
                    originalColor = _bmpData.getPixel(i,j);

                    if(i>cropIconX && j>cropIconY){
                        temporaryBitmapData.setPixel(i,j,originalColor);
                    }else{
                        temporaryBitmapData.setPixel(i,j,dimmedColor);
                    }
                }
            }
            /*
            *by the end of this loop, we have, in the temporaryBitmapData variable, a version of the _bmpData,
            *the area to be cropped out dimmed a little bit.
            */

            return temporaryBitmapData;
        }

, если вы внимательно посмотрите внутрь первого if в самом внутреннем цикле для ,

temporaryBitmapData.setPixel(i,j,originalColor);

этот бит кода должен выполнять следующее:

Если этот (i, j) пиксель находится на вне «области, подлежащей вырезке», топерекрасьте его в исходный цвет пикселя.

Это просто не может заставить это работать !!!!

Я заменил эту строку некоторым жестко закодированным значением (скажем, 0xFFFFFF длябелый) и это сработало, так что проблема не в этом ....

Надеюсь, вы, ребята, можете помочь мне, я потратил более 4 часов на это уже пробуя много разных подходов !!

PS> Я отладил этот код в FB 4.5 и установил точку останова в этом самом операторе if.По какой-то причине переменная _bmpData, , в которой я хочу получить исходный цвет пикселя от , показывает маленький красный квадрат рядом с ним .... Возможно, это что-то указывает .. возможно, это как-тотокарно-'locked '??Я не знаю, надеюсь, кто-то может понять!

РЕДАКТИРОВАТЬ Проблема, с которой я столкнулся, заключается в следующем: затемнение изображения работает нормально, но если я затем переместлю курсор мыши обратно в область, которая затемнена, тоИсходное изображение не перекрашивается, как ожидалось.

1 Ответ

1 голос
/ 04 сентября 2011

Должно быть, там что-то еще происходит ... Я только что проверил ваш код, и он работал нормально для меня.

package  {

    import flash.display.MovieClip;
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.net.*;
    import flash.display.Loader;
    import flash.events.Event;

    public class ImageCropper extends MovieClip {

        protected var _bmpData:BitmapData;
        protected var _mouseX:int;
        protected var _mouseY:int;
        var imageLoader:Loader;

        public function ImageCropper() {
            _mouseX = 80;
            _mouseY = 50;
            imageLoader = new Loader();
            var image:URLRequest = new URLRequest("http://www.travelooce.com/pics/bear_picnic_table.jpg");
            imageLoader.load(image);
            imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, _imageLoaded);
            imageLoader.x = 0;
            imageLoader.y = 0;

        }

        public function _imageLoaded($evt:Event):void {
            _bmpData = new BitmapData(imageLoader.width, imageLoader.height, false);
            _bmpData.draw(imageLoader);
            var bmp2:BitmapData = returnCropIndicatorBmpDataForTopLeft();
            var bmp:Bitmap = new Bitmap(bmp2);
            addChild(bmp);
        }

        private function returnCropIndicatorBmpDataForTopLeft():BitmapData{

            var topLeftX:int     = 0;
            var topLeftY:int     = 0;

            var topRightX:int    = _bmpData.width;
            var topRightY:int    = 0;

            var bottomRightX:int = _bmpData.width;
            var bottomRightY:int = _bmpData.height;

            var bottomLeftX:int  = 0;
            var bottomLeftY:int  = _bmpData.height;

            var cropIconX:int    = _mouseX;
            var cropIconY:int    = _mouseY;

            // This is the important line to change.
            var temporaryBitmapData:BitmapData = _bmpData.clone();

            var originalColor:uint;
            var dimmedColor:uint = 0x202020;

            for (var i:int = 0; i < _bmpData.width; i++) 
            {
                for (var j:int = 0; j < _bmpData.height; j++) 
                {
                    originalColor = _bmpData.getPixel(i,j);

                    if(i>cropIconX && j>cropIconY){
                        temporaryBitmapData.setPixel(i,j,originalColor);
                    }else{
                        temporaryBitmapData.setPixel(i,j,dimmedColor);
                    }
                }
            }
            /*
            *by the end of this loop, we have, in the temporaryBitmapData variable, a version of the _bmpData,
            *the area to be cropped out dimmed a little bit.
            */

            return temporaryBitmapData;
        }
    }

}

Выход:

http://cl.ly/3d0h023C1p392O270I2Lвведите описание изображения здесь

...