2014-06-15 1 views
1

그레이 스케일 이미지로 변환 한 후 이미지를 저장하고 싶습니다. 하지만 변환 후 이미지를 저장하는 데 문제가 있습니다. 나는 성공적으로 as3에 의해 그레이 스케일로 이미지를 변환하지만, 사용자 정의 클래스 BitmapSaver에 의해이 컬러 수정 된 이미지를 저장할 때, 저장된 이미지는 다시 그레이 스케일이 아닌 원래 색상입니다. 왜 이렇게 이해가 안되니? 아무도이 문제에 대해 알고 있다면, 제발 도와주세요 .... !!! 미리 감사드립니다 ... !!!이미지를 그레이 스케일로 변환하고 사용자 정의 클래스로 저장 BitmapSaver

import flash.display.Bitmap; 
import flash.display.Loader; 
import fl.controls.Button; 
import flash.net.FileReference; 
import flash.net.FileFilter; 
import flash.events.Event; 
import flash.events.MouseEvent; 
import flash.utils.ByteArray; 
import fl.motion.AdjustColor; 
import flash.filters.ColorMatrixFilter; 
import com.flashandmath.dg.bitmapUtilities.BitmapSaver; 

var imageFilter=new FileFilter("Images", "*.jpg;*.jpeg;*.gif;*.png"); 
var fileR:FileReference=new FileReference(); 
fileR.addEventListener(Event.SELECT, selectHandler); 
fileR.addEventListener(Event.COMPLETE, completeHandler); 

pickbutton.addEventListener(MouseEvent.CLICK,selectImage); 

function selectImage(e:MouseEvent):void{ 
    fileR.browse([imageFilter]); 
} 
function selectHandler(e:Event):void{ 
    trace("selectHandler: "+fileR.name); 
    fileR.load(); 
} 
function completeHandler(e:Event):void { 
    trace("completeHandler: " + fileR.name); 
    var ba:ByteArray=fileR.data; 
    var loader:Loader=new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loaded); 
    loader.loadBytes(ba); 
} 
var bm:Bitmap; 

function loaded(e:Event):void{ 

    bm = e.currentTarget.loader.content as Bitmap; 

    addChild(bm); 
    adjustColor(); 
} 

function adjustColor():void 
{ 
    var ac:AdjustColor = new AdjustColor(); 

    ac.brightness = 20; 
    ac.hue = 0; 
    ac.saturation = -100; 
    ac.contrast = 40; 

    var ar:Array = ac.CalculateFinalFlatArray(); 
    var cl:ColorMatrixFilter = new ColorMatrixFilter(ar); 

    var filter:Array = new Array(cl); 
    bm.filters = filter; 

    var saver:BitmapSaver = new BitmapSaver(bm.bitmapData); 
} 

답변

1

나는 당신이 이미지에 사용자 정의 필터를 적용하기 때문에 그것을 생각하고 당신은 bitmapData을 저장합니다. 필터는 bitmapData을 직접 수정하지 않습니다. 즉, 이미지를 그리는 데 Flash에서 이미지를 조작합니다. 플래시 IDE에 적용된 흐림 필터처럼 생각하면 이미지가 흐리게 보이지만 원본 이미지는 수정되지 않습니다.

그래서 당신은 단지 그것을 수정의 BitmapData을 가지고 사용하는 간단한 draw를 사용해야과 유사한 :

var modified:BitmapData = new BitmapData(original.width, original.heigth); 
modified.draw(original); 

var saver:BitmapSaver = new BitmapSaver(modified); 

이 어쩌면 약간의 조정과 함께, 트릭을해야한다.

편집 : @George Profenza가 의견으로 제공 한 것처럼 다른 좋은 옵션이 있습니다. 원래의 BitmapData가 필요하지 않은 경우 표시 객체가 아닌 필터를 직접 설정할 수 있습니다. 이렇게하면 원본 소스가 변경되고 모든 종류의 보호기를 사용하여 트릭을 직접 수행 할 수 있습니다. 당신은 그것을 되돌릴 수 없다는 것을 명심하십시오.

어쨌든 두 번째 BitmapData 객체를 만들 필요가 없다는 점을 염두에두면 좋은 방법입니다. 즉, 메모리를 늘리지 않을 것입니다.

원래 BitmapData가 필요함에 따라 복사/복제하거나 직접 필터를 사용하십시오.

건배!

+3

또 다른 옵션은 [필터 적용] (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/BitmapData.html#applyFilter())을 BitmapData에 직접 적용하는 것입니다 (예 :'bm.bitmapDataa.applyFilter (bm.bitmapData, new Rectangle (0,0, bm.bitmapData.width, bm.bitmapData.height), 새로운 Point(), cl), ' –

+0

아주 사실! 더 많은 객체를 생성하지 않으므로 더 나은 방법입니다 (원래 비트 맵이 필요하지 않은 경우). 따라서 크기가 약 절반 인 메모리를 사용합니다. –

+0

자유롭게 답을 업데이트하십시오.) –

관련 문제