2012-02-07 2 views
0

매우 작은 배율로 조정 한 후에 부드럽게 적용하려면 비트 맵을 가져 오는 데 도움이 필요합니다.낮은 배율 값에서 AS3 비트 맵 객체가 스무딩되지 않음

현재 내가하고있는 일은 .png 이미지를 Loader 개체로로드하는 것입니다. 파일을로드 한 후 loaderInfo의 내용을 비트 맵에 캐스팅하고 smoothing 값을 true로 설정합니다. 이것은 ScaleX와 ScaleY 값이 0.5 미만이 될 때까지 문제없이 작동합니다.

예를 들어, 1000x1000 오브젝트가있는 경우 200x200으로 축소하면 비트 맵 스무딩이 더 이상 작동하지 않습니다.

  • 변경 비트 맵에 scaleX가 및 scaleY 속성 :

    나는 다음과 같은 크기 조정 방법을 모두 사용하여 문제를 재현 할 수 있습니다.

  • 비트 맵의 ​​높이 및 너비 속성을 직접 변경하십시오.
  • 비트 맵을 다른 스프라이트의 자식으로 추가하고 스프라이트의 scaleX 및 scaleY 속성을 변경합니다.
  • 비트 맵을 다른 스프라이트의 자식으로 추가하고 스프라이트의 높이 및 너비 속성을 변경합니다.
  • 매트릭스 스케일을 사용하여 새 BitmapData 객체를 만든 다음 원본 BitmapData를 그 위에 드래그합니다.

    • 비트 맵의 ​​높이와 너비를 강제 1.001 또는 0.999
    • 에 이미지의 scaleX 설정 :

    는 또한 같은 검색 할 때 내가 찾은 다른 해결 방법을 시도했습니다 짝수 인 개체.

다음은 문제를 재현하기위한 샘플 코드입니다.

public class MainObj 
{ 
    public var comp:UIComponent; 

    public function MainObj() 
    { 
    } 

    public function LoadContent():void 
    { 
     var str:String = "testimage.png"; 
     var l:Loader = new Loader(); 
     l.contentLoaderInfo.addEventListener(Event.COMPLETE, LoadContentComplete); 
     l.load(new URLRequest(str)); 
    } 

    public function LoadContentComplete(e:Event):void 
    { 
     var li:LoaderInfo = e.target as LoaderInfo; 
     var bmp:Bitmap = li.content as Bitmap; 

     bmp.smoothing = true; 
     bmp.scaleX = 0.2; 
     bmp.scaleY = 0.2; 
     comp.addChild(bmp); 
    } 
} 

나는 또한 MainObj 클래스의 인스턴스를 생성하고로 빌려 속성을 설정하는 MXML 파일이 (내 빈-debug 폴더에 testimage.png의 복사본이 그래서 로컬이를 실행하고 있습니다) 응용 프로그램 mxml 코드에 추가 된 UIComponant 인스턴스 (UIComponent는 비트 맵을 mxml을 구성하는 Spark 요소에 추가 할 수있게 해줍니다). 원래 크기는 2

  • 밉 매핑의 전력 인 2의 거듭 제곱 크기에

    <?xml version="1.0" encoding="utf-8"?> 
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" 
           minWidth="955" minHeight="600" 
           width="800" height="600"> 
        <fx:Declarations> 
         <!-- Place non-visual elements (e.g., services, value objects) here --> 
        </fx:Declarations> 
        <fx:Script> 
         <![CDATA[ 
          private var mainObj:MainObj; 
          override protected function initializationComplete():void 
          { 
           mainObj = new MainObj(); 
           mainObj.comp = comp; 
           mainObj.LoadContent(); 
    
           super.initializationComplete(); 
          } 
         ]]> 
        </fx:Script> 
        <s:VGroup width="100%" height="100%"> 
         <mx:UIComponent id="comp" width="100%" height="100%"/> 
        </s:VGroup> 
    </s:Application> 
    
  • +3

    언제든지 BitmapData.draw()를 통해 작은 BitmapData 복사본을 만들고 사본 크기를 조정하여이 문제를 해결할 수 있습니다. 이것은 복사본 생성과'bitmap.bitmapData' 스위칭을위한 로직을 필요로합니다. –

    +0

    팁 주셔서 감사.:)이 작업을 시도했지만 제대로 작동했지만 현재 렌더링 아키텍처에 잘 맞지 않습니다. 최악의 상황이 발생하면 그것을 처리 할 방법을 찾을 것입니다. –

    답변

    2
    • 규모 위해 이미지의 확대 된 여러 버전을 만들기위한 게임 업계의 용어 인기 스케일링 앨리어싱을 줄입니다. (특히 급진적 인 크기 변경)
    • Flash Player 10의 해킹으로 'z'속성을 1로 설정하십시오. 그러면 더 많은 메모리와 성능을 필요로하지만 비트 맵의 ​​하드웨어 스무딩이 활성화됩니다.
    +0

    며칠 동안이 부분을 보류 상태로 만들어야했습니다. 내가 그것에 착수하자마자, 나는 z 속성에 시도를 줄 것이다. 의견을 보내 주셔서 감사합니다. (원본 이미지를 2의 거듭 제곱으로 변경할 수는 없지만 크기 조정을 적용하기 전에 2 차원의 새로운 도형을 사용하여 BitmapData 그리기를 사용하여 이미지의 가운데에 복사본을 만들 수 있음 * 이것은 위의 설명에서 설명한 것과 같은 구조적인 어려움이 있습니다. –

    +0

    Z 속성을 변경하면 이미지에서 모든 다듬기가 제거되어 문제가 악화됩니다. 플래시 플레이어 11을 사용하고 있습니다 (타겟팅). 소스 이미지가 2의 힘으로 보장 될 수 없기 때문에 원본 게시물의 댓글이 유일한 실현 가능한 해결 방법입니다. 밉 매핑에 익숙합니다. , iirc는 id 기술 1에서 독자적인 텍스처 형식으로 사용되었습니다. 아마 아직도 사용되었습니다. 그러나 소스 이미지를 제어 할 수 없어 옵션이 아닙니다. 그러나 점진적 스케일링의 사용은 밉 매핑의 한 형태처럼 보입니다. –

    +0

    +1 "a"스무딩을 강요하는 z 속성에 대해 몰랐습니다. 감사합니다. – kontur

    0

    나는 StageQuality.BESTstage.quality 속성을 설정하면 확장 비트 맵의 ​​스무딩을 향상 것으로 나타났습니다.

    관련 문제