2014-07-11 8 views
0

두 개의 Renderscripts : ScriptIntrinsicBlur 및 ScriptIntrinsicColorMatrix를 연결하려고합니다.
나는 이미지를 흐리게 처리하고 컬러 필터를 적용하려고합니다. 여기 Chain 2 Renderscript Intrinsics : Blur & ColorMatrix

내 현재 코드입니다 (내가 일을 얻을 수없는, ScriptGroups 등 다양한 구현을 시도 :

final ScriptIntrinsicBlur scriptBlur = ScriptIntrinsicBlur.create(
     mRenderScript, 
     Element.U8_4(mRenderScript)); 
final Allocation input = Allocation.createFromBitmap(mRenderScript, 
     bmp); 
Bitmap blurOutBitmap = bmp.copy(bmp.getConfig(), true); 
final Allocation output = Allocation.createFromBitmap(
     mRenderScript, blurOutBitmap); 

scriptBlur.setRadius(mBlur_Radius); 
scriptBlur.setInput(input); 
scriptBlur.forEach(output); 
bmp.recycle(); 
output.copyTo(blurOutBitmap); 

mRenderScript.finish(); 

final ScriptIntrinsicColorMatrix scriptColor = ScriptIntrinsicColorMatrix 
     .create(mRenderScript, Element.U8_4(mRenderScript)); 

/** for a first test, I am using a simple blue filter **/ 
Matrix3f mat = new Matrix3f(new float[] { 
     1, 0, 1, 
     0, 1, 1, 
     0, 0, 1 
}); 
scriptColor.setColorMatrix(mat); 

final Allocation colorInput = Allocation.createFromBitmap(mRenderScript, 
     blurOutBitmap); 
Bitmap outBitmap = bmp.copy(blurOutBitmap.getConfig(), true); 
final Allocation colorOutput = Allocation.createFromBitmap(
     mRenderScript, outBitmap); 

scriptColor.forEach(colorInput, colorOutput); 
blurOutBitmap.recycle(); 
colorOutput.copyTo(outBitmap); 
displayBitmap(outBitmap); 

를이 코드는 이미지에 매우 추한 유물을 생산하는 (병렬 레드 라인) 및 나는 ScriptGroup를 사용하려고하면 대신 단순히 여기

+0

흐림 내장 함수가 실행 된 후에'bmp.recycle() '을 호출하지 않으셨습니까? 이 호출은'Bitmap' 객체 뒤에 네이티브 버퍼를 비우지 만 나중에 컬러 필터를 위해'outBitmap'을 설정할 때 그 객체가 다시 사용됩니다. –

+0

@LarrySchiefer 흠, 마무리가 끝난 후에 만 ​​재활용하는 것이 현명 할 수도 있습니다. 감사 ! 사실, 나는이 그룹을 일하게하는 방법을 발견했다. 이 ScriptGroup + Intrinsic 케이스에 버그가있는 것 같습니다. – Teovald

답변

1

.
가 Renderscript 경험을 가진 사람이 나를 왜? 그 주제에 거의 샘플이나 문서가 있기 때문에, 내가 노력하고 붙어 있어요 임의 수정을 해독 할 수 있습니다 않습니다. 충돌입니다 이 작업을 수행하는 올바른 방법 (또는 적어도 o 이 경우는 약간 버그가 있습니다.) :

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.lenna); 

     ScriptIntrinsicBlur scriptBlur = ScriptIntrinsicBlur.create(mRenderScript, Element.U8_4(mRenderScript)); 
     scriptBlur.setRadius(5f); 

     ScriptIntrinsicColorMatrix scriptColor = ScriptIntrinsicColorMatrix.create(mRenderScript, Element.U8_4(mRenderScript)); 

     final Allocation input = Allocation.createFromBitmap(mRenderScript, bitmap, 
       Allocation.MipmapControl.MIPMAP_NONE, 
       Allocation.USAGE_SCRIPT | Allocation.USAGE_SHARED); 
     scriptBlur.setInput(input); 
     Bitmap outBitmap = bitmap.copy(bitmap.getConfig(), true); 
     final Allocation output = Allocation.createTyped(mRenderScript, input.getType()); 


     scriptColor.setColorMatrix(new Matrix4f(
       new float[]{1, 0f, 0f, 0, 
          1, 1, 0f, 0, 
          1, 0f, 1, 0, 
          0, 0, 0, 1} 
     )); 


     ScriptGroup.Builder b = new ScriptGroup.Builder(mRenderScript); 
     b.addKernel(scriptBlur.getKernelID()); 
     b.addKernel(scriptColor.getKernelID()); 
     b.addConnection(input.getType(), scriptBlur.getKernelID(), scriptColor.getKernelID()); 
     ScriptGroup group = b.create(); 

     // group.setInput(scriptBlur.getKernelID(),input); 
     group.setOutput(scriptColor.getKernelID(), output); 


     group.execute(); 
     output.copyTo(outBitmap); 
     return outBitmap;