这段代码有什么问题?

时间:2011-09-04 05:10:04

标签: flex actionscript-3 flex4 flex4.5

我正在尝试在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;
        }

如果仔细查看最里面的 for 循环中的第一个 if 语句,

temporaryBitmapData.setPixel(i,j,originalColor);

该代码应该执行以下操作:

如果此(i,j)像素 在“待裁剪区域”之外,则用原始像素颜色重新绘制它。

似乎无法让它工作!!!!

我用一些硬编码的值替换了那一行(例如,白色为0xFFFFFF)并且确实有效,所以问题不存在......

希望你们能帮助我,我花了4个多小时就已经尝试了很多不同的方法!!

P.S.&GT;我在FB 4.5中调试了这段代码,并在if if语句中放置了一个断点。出于某种原因,_bmpData变量是我想要从获取原始像素颜色的地方,在它旁边显示一个小红色方块....也许这表明了一些事情......也许它是某种程度上线程''锁定​​'??我不知道,希望有人能搞清楚!

编辑我遇到的问题如下:图像的调光工作正常,但是如果我将鼠标光标移回到变暗的区域,那么原始图像不会按预期重新粉刷。

1 个答案:

答案 0 :(得分:1)

那里肯定还有其他东西......我只是测试了你的代码,它对我来说很好。

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 enter image description here