태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.
밤하늘의 실제별, 나도 가질 수 있다?!

[Flex, AIR 팁] 이미지 회전,확대시 깨지는 것 방지하는 방법, smoothing을 사용하자.

2008/05/10 11:51

 

[공지]이미지나 링크가 깨졌다면 댓글 부탁드립니다.

Flex에서 Image 클래스를 이용해서 로드하는 컨텐츠중 png, jpg 등의 이미지를 회전, 확대를 하게 되면 이미지가 약간씩 깨진다.

이때 깨지는 것을 방지하기 위해 Bitmap클래스의 smoothing 속성을 true로 설정하면되는데...
Image클래스에 로드되는 컨텐츠는 DisplayObject이므로 바로 smoothing을 적용할 수 없다.
매번 smoothing속성을 적용하는 것도 귀찮으므로
Image클래스를 확장하여 SmoothImage 클래스를 만들어 보았다.

/**

 * SmoothImage 클래스

 * 제작 : 지돌스타(http://blog.jidolstar.com, jidolstar@gmail.com)

 * 환경 : Flex 3

 *

 * Image 로드하는 컨텐츠에 smoothing 자동적용시켜 회전, 확대시 이미지가 깨지는 것을 방지해준다.

 */

package com.starpl.components

{

       import flash.display.Bitmap;

       import flash.display.DisplayObject;

       import flash.events.Event;

       import flash.events.IOErrorEvent;

       import flash.events.SecurityErrorEvent;

      

       import mx.controls.Image;

 

       public class SmoothImage extends Image

       {

             public function SmoothImage()

             {

                    super();

             }

            

             override public function load(url:Object=null):void

             {

                    super.load(url);

                    addEventHandlers();

             }

            

             private function completeEventHandler(event:Event):void

             {

                    var content:DisplayObject = this.content as DisplayObject;

                    var bitmap:Bitmap;

                    if(content)

                    {

                           bitmap = content as Bitmap;

                           if( bitmap )

                                 bitmap.smoothing=true;

                    }

                    removeEventHandlers();

             }

            

             override public function set source(value:Object):void

             {

                    var bitmap:Bitmap = value as Bitmap;

                    if( bitmap )

                    {

                           bitmap.smoothing = true;  

                    }

                    super.source = value;

             }

            

             private function ioEventHandler(event:IOErrorEvent):void

             {

                    removeEventHandlers();

             }

            

             private function securityErrorEventHandler(event:SecurityErrorEvent):void

             {

                    removeEventHandlers();

             }

            

             private function addEventHandlers():void

             {

                    this.addEventListener(Event.COMPLETE, completeEventHandler);

                    this.addEventListener(IOErrorEvent.IO_ERROR, ioEventHandler);

                    this.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorEventHandler);

             }

            

             private function removeEventHandlers():void

             {

                    this.removeEventListener(Event.COMPLETE, completeEventHandler);

                    this.removeEventListener(IOErrorEvent.IO_ERROR, ioEventHandler);

                    this.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorEventHandler);

             }

       }

}




사용방법은 Image처럼 사용하면 되겠다.

 <local:SmoothImage id="image" source="이미지경로" rotation="회전각도" scaleX="x축스케일" scaleY="y 스케일"/>


아래와 같은 이미지를 보통 Image클래스를 사용할 때와 SmoothImage 클래스를 사용할 때를 비교해 보겠다.


사용자 삽입 이미지

사용자 삽입 이미지

Image를 사용했을 때

사용자 삽입 이미지

SmoothImage를 사용했을 때



어려운 팁은 아닌데 의외로 알면 유용하다는 거~~ ^^

글쓴이 : 지돌스타(http://blog.jidolstar.com/329)

크리에이티브 커먼즈 라이선스
Creative Commons License

Adobe Flash Platform , , , , , , , , ,

Trackback 주소: http://blog.jidolstar.com/trackback/329
  1. Cooooooooooooooooooooooooooooooooooooooooooooool!!!

  2. Blog Icon
    시드

    멋찌십니다~~ ^^

  3. Blog Icon
    찌노

    크~ 아주 유용한 정보네요~

  4. 지돌님 항상 들러서 좋은 팁 많이 보고 갑니다^^.
    스무쓰이미지도 제가 살짝 업어가서 사용중인데요
    동적로딩한 경우에는 적용되지만 @Embed한 경우에는 COMPLETE이벤트가 호출되지 않기 때문에 따로 smooth를 켜줘야 하는거같네요

  5. Blog Icon
    웹방

    Image 클래스로 불러온 파일(JPG, GIF, PNG, SWF)의 원본 사이즈는 어떻게 구할 수 있나요?
    Image.loaderInfo.loader를 이용해서 Image.loaderInfo.loader.contentLoaderInfo.width로 하니깐

    Image.loaderInfo.loader가 null이네요.
    혹시 다른 방법이나 꽁수가 있을 런지요?

  6. 컨텐츠의 폭과 높이는 컨텐츠가 모두 로드가 완료되었을때 알 수 있습니다. loadComplete 이후에 접근해보세요.

  7. Blog Icon
    웹방

    public class ItemImage extends Image
    {
    public function ItemImage():void{
    super();
    this.width = 118; this.height = 101;
    this.scaleContent = true;
    this.maintainAspectRatio = false;
    //handler
    this.addEventListener(MouseEvent.MOUSE_DOWN, downHandler, false, 1, true);
    this.addEventListener(MouseEvent.MOUSE_UP, upHandler, false, 1, true);
    this.addEventListener(Event.COMPLETE, onComplete);
    }
    private function downHandler(e:MouseEvent):void{
    ...
    ...
    e.stopImmediatePropagation();
    }
    private function upHandler(e:MouseEvent):void{
    ...
    ...
    e.stopImmediatePropagation();
    }
    private function onComplete(e:Event):void{
    Application.application.myDebug.text += "Image onComplete:"+this.loaderInfo.loader;
    }
    }

    위가 클래스에서
    var a:ItemImage = new ItemImage();
    Canvas.addChild(a);
    a.source = "./image.jpg";
    하면 해서 myDebug에 찍어 보면 Image onComplete:null 이라고 뜹니다...^^;;

  8. this.loaderInfo.width는요?

  9. Blog Icon
    웹방

    this.content.width로 해결되었네요...

    this.scaleContent = true;
    this.maintainAspectRatio = false;
    사이징을 하면 content사이즈도 따라서 사이징 되는 줄 알았는데,
    아닌가 봐요..^^;;

  10. 아~ 맞다~ ㅋㅋㅋ
    content 속성으로 접근하면 됩니다.
    content 자체가 displayObject거든요.
    위의 코드에 나와 있는데 ^^

  11. Blog Icon
    웹방

    감사합니다...
    블로그 아주 잘 보고 있습니다...^^

  12. contentWidth, contentHeight 를 이용하셔도 됩니다. ^^