2011-09-16 2 views
0

시간이 지남에 따라 색상을 변경하고 싶은 비트 맵 (bitmapData)이 있습니다. 나는 색상 변환을 적용하는 예제를 보았고 작동시키지 못했습니다. 또한이 예제에서는 단 하나의 색상 만 적용합니다. ROYGBIV 범위를 통해 애니메이션을 만들고 싶습니다. 참고 : 이미지를 동적으로로드하고 있습니다. 나는 이미지에 색조를 넣고 싶지 않습니다. 이미지에서 색이 바뀌기를 원한다면 변경하십시오.비트 맵 이미지에서 무지개 색으로 애니메이션을 적용하는 방법

+0

자신의 Pixel Bender 커널을 만들고 비트 맵의 ​​쉐이더 필터를 통해 제어 할 수있는 옵션이 있습니다. 성능면에서 나는이 방법이 가장 좋을 것이라고 생각합니다. – TheDarkIn1978

답변

1

가 조작 할 수있는 P/색조 색상 당신이 colorTransform이 기능을 사용

는 설명하기 위해 다음 예에서
나는 이미지와 참조를 포함 이하 만약 당신이 어도비 플래시를 사용한다면 당신은 당신의 자산을 '이름 짓고'코드에서 그것을 참조 할 것입니다.

import flash.geom.ColorTransform; 
    import flash.events.Event; 
    import flash.display.Bitmap; 

    [Embed(source="img/logo.png")] private var logoCls:Class; 
    private var bitmapLogo:Bitmap = new logoCls(); 

    public function Test() 
    { 
     addEventListener(Event.ADDED_TO_STAGE, init); 
     addEventListener(Event.ENTER_FRAME, onEnterFrame); 
    } 

    private function init(e:Event):void 
    { 
     removeEventListener(Event.ADDED_TO_STAGE, init); 
     addChild(bitmapLogo); 
    } 

    // r, g, b colors 
    var r:int = 256; // start at Red 
    var g:int = 0; 
    var b:int = 0; 
    var increment:int = 16; // how quickly to change the color 
    var colorCycle:int = 0; 
    var mult:Number = 0.25; // How heavily TINTED you want the image 

    private function onEnterFrame(e:Event):void 
    { 
     var ct:ColorTransform = new ColorTransform (1-mult,1-mult,1-mult,1,r*mult,g*mult,b*mult,0); 
     bitmapLogo.transform.colorTransform = ct; 
     incrementRainbowColors(); 
    } 
    private function incrementRainbowColors():void 
    { 
     if (colorCycle == 0) // -> yellow 
      if ((g+=increment) >= 256) colorCycle=1; 
     else if (colorCycle == 1) // -> green 
      if ((r-=increment) <= 0) colorCycle=2; 
     else if (colorCycle == 2) // -> cyan 
      if ((b+=increment) >=256) colorCycle=3; 
     else if (colorCycle == 3) // -> blue 
      if ((g-=increment) <= 0) colorCycle = 4; 
     else if (colorCycle == 4) // -> magenta 
      if ((r+=increment) >=256) colorCycle = 5; 
     else if (colorCycle == 5) // -> red 
      if ((b-=increment)<=0) colorCycle = 0; 
    } 

} 
+0

감사합니다 15 자 –

+0

그 의견을 이해 못하겠습니까? 'thank you 15 characters' – eLouai

+0

스택 오버플로는 주석을 게시하기 전에 적어도 15자를 입력해야합니다. "감사합니다"는 15 자 미만입니다. 그래서 나는 적어도 15 문자 이상을 써야한다고 생각해야한다. –

1

당신은 bitmapData로 작업한다고 했으므로이 답변은 직접 조작 할 수 있다고 가정합니다.

bitmapData.setPixel(row, column, color);을 사용하면 픽셀의 색상을 변경할 수 있습니다. 행과 열은 0을 기본으로하며 수정해야 할 픽셀을 정확히 나타냅니다. 이전에이 규칙을 다뤄 본 적이 없다면 그리드 종이라고 생각하면됩니다. color 매개 변수는 실제로는 uint - 부호없는 정수입니다. 0x000000과 같은 16 진수 값을 사용하여 픽셀을 검정색으로 설정하고 0xFFFFFF를 흰색으로 설정할 수 있습니다.

색상을 변경하려면 uint에 대해 다른 값을 반복하면됩니다. 16777215 가지 색상에 대해 가능한 여러 가지 값이 있습니다. 솔직히 16 진수 색상에 대해 많이 알지 못합니다.

수학적으로 기울이면 약간의 팁이 있습니다. 16 진수의 각 부분은 해당 부분의 힘에 해당합니다. * 해당 부분의 실제 숫자입니다 (10 진수). 여기에 시각적 인 예가 나와 있습니다. 16 진수의 456789는 (4 * 16^5) + (5 * 16^4) + (6 * 16^3) + (7 * 16^2) + (8 * 16^1) + (9 * 16^0)은 십진법으로 4548489와 같습니다.

첫 번째 2 개 지점 (왼쪽부터)은 빨간색, 파란색, 녹색에 해당합니다. FF0000은 빨간색, 00FF00은 녹색, 0000FF는 파란색입니다. setPixel 함수에서 색상의 십진수 값을 제공 할 수 있으므로 무작위 스타일 패턴으로 원하는 색상/색상을 얻기 위해 일부 변환을 수행하거나 온라인에서 찾을 수 있습니다!

나는 헥스에이 임의의 충돌 과정이 도움이되었다 희망 :

+1

setPixel을 통해 bitmapData를 조작하면 속도가 느려지므로 setPixels 또는 setVector를 사용하는 것이 좋습니다. 비트 맵 생성에 대한 흥미로운 링크 : http://webr3.org/blog/haxe/bitmapdata-vectors-bytearrays-and-optimization/ – moropus

+0

매우 사실! 나는 할당을 위해 그냥 setPixel로 작업을 끝냈다. 그래서 나는 약간 편향된 하하였다. 좋은 링크도! – KennyRules

+0

길이 15 문자로 감사합니다 –

관련 문제