【问题标题】:Dynamic loaded image looks bad at some part - flash as3动态加载的图像在某些部分看起来很糟糕 - flash as3
【发布时间】:2014-09-12 05:09:00
【问题描述】:

我们正在通过 xml 在磁贴可视化应用程序中加载图像,图像在某些部分看起来不平滑,并且磁贴图像内部的线条看起来参差不齐。这是图片链接 [1]:http://postimg.org/image/h4schoiub/"![在此处输入图片描述][1]

请注意,我不是 Flash 动作脚本专家

这是我的图像处理程序代码

package com.listplugin
{
    import flash.display.Loader;
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.ProgressEvent;
    import flash.net.URLRequest;
    import flash.utils.getDefinitionByName;


    //Use of class
    //l2.img.setSource("gear.png");
    //l2.img.setDimension(199,87,true);
    //l2.img.startLoad();

    /**
     * ...
     * @author Mike 2011
     */
    public class ImageHandler extends MovieClip
    {
        private var url:String;
        private var isExternal:Boolean;
        private var img;
        private var w:Number;
        private var h:Number;
        private var maintainRatio:Boolean;
        private var m_owner:MovieClip;
        private var m_func:MovieClip;
        private var center:Boolean;
        private var childs:Array;
        private var isSmooth:Boolean;
        public function ImageHandler()
        {

        }
        public function setSource(p_url:String)
        {
            isSmooth = false;
            if (childs)
            {
                for (var i = 0; i < childs.length; i++)
                {
                    removeChild(childs[i]);
                }
            }
            childs = new Array();
            center = true;
            url = p_url;
            isExternal = true;
            if (url.indexOf(".jpg") == -1 && url.indexOf(".gif") == -1 && url.indexOf(".png") == -1 && url.indexOf(".jpeg") == -1 && url.indexOf(".jpeg") == -1)
            {
                isExternal = false;
            }
        }
        public function startLoad()
        {
            if (isExternal == true)
            {
                loadExternalImage();
            }
            else
            {
                var ClassReference:Class = getDefinitionByName( url ) as Class;
                img = new ClassReference();             

                addImage();         
                if (m_func)
                    m_func.imageloaded();
            }
        }
        public function setDimension(p_width:Number, p_height:Number, p_maintainratio)
        {
            w = p_width;
            h = p_height;
            maintainRatio = p_maintainratio;
        }
        public function makeSmooth(p_flag:Boolean)
        {
            isSmooth = p_flag;
        }
        private function loadExternalImage()
        {
            var mLoader:Loader = new Loader();
            var mRequest:URLRequest = new URLRequest(url);

            mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
            mLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgressHandler);
            mLoader.load(mRequest);

        }
        private function onCompleteHandler(loadEvent:Event)
        {
            img = loadEvent.currentTarget.content;

            addImage();

        }
        public function callback(p_owner:MovieClip)
        {           
            m_func = p_owner;
        }
        private function addImage()
        {
            if (w == 0)     w = img.width;
            if (h == 0)     h = img.height;

            if (maintainRatio == true)
            {
                var hgap = img.width - w;
                var vgap = img.height - h;
                if (img.height > img.width)
                {
                    img.height = h;
                    img.scaleX = img.scaleY;
                    if (img.width > w)
                    {
                        img.width = w;
                        img.scaleY = img.scaleX;
                    }

                }
                else
                {
                    img.width = w;
                    img.scaleY = img.scaleX;
                    if (img.height > h)
                    {
                        img.height = h;
                        img.scaleX = img.scaleY;
                    }

                }
                if (center==true)
                {
                    img.x = (w - img.width) / 2;
                    img.y = (h - img.height) / 2;
                }
            }
            else
            {
                img.width = w;
                img.height = h;
            }

            addChildAt(img, 0);
            childs.push(img);
            if (m_func)
                m_func.imageloaded();

        }
        public function makeCenter(p_flag:Boolean)
        {
            center = p_flag;
        }
        private function onProgressHandler(mProgress:ProgressEvent)
        {
            var percent:Number = mProgress.bytesLoaded/mProgress.bytesTotal;

        }

    }   
}

【问题讨论】:

    标签: actionscript-3 flash


    【解决方案1】:

    那是因为你正在缩放图像。

    Loader 会返回一个 Bitmap 对象,它有一个叫做 smoothing 的属性。

    基本上你应该这样做

    var img:Bitmap;
    
    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.Complete, onComplete);
    loader.load(new URLRequest(pathToTheImage));
    
    function onComplete(e:Event):void{
        img = e.content as Bitmap;
        img.smoothing = true;
        //then scale it
    }
    

    查看Bitmap 的 AS3 文档

    【讨论】:

    • 好吧其实我对动作脚本一无所知。你能告诉我应该把这段代码准确地放在哪里吗?
    • 当然,在您的 OnCompleteHandler(loadEvent:Event) 函数中,就在您对 addImage() 的函数调用之前。那么它应该会自动平滑图像。
    • 我尝试添加您的代码,但它给了我错误。检查这张图片postimg.org/image/dyqxmmvzp
    • 投了反对票。平滑几乎不能解决这个问题。通过压缩或扩展其像素来缩放位图总是看起来很糟糕。而不是缩放,您需要使用矩阵将位图重新绘制为位图数据以进行缩放。当然,放大后结果仍然很糟糕,因为无法弥补额外的像素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多