2016-05-05 4 views
1

Я пытаюсь использовать Renderscript для создания размытого растрового изображения, чтобы установить его в качестве фона для LinearLayout который содержит ImageView. Я также хочу, чтобы ясная оригинальная копия растрового изображения, чтобы я мог установить его как изображение в ImageView.Renderscript размытия переопределяет исходное растровое изображение

Вот мой код:

ImageView mainImage; 

Bitmap mainBMP, blurredBMP 

LinearLayout background; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_work_area); 

    getImage(); // obtain bitmap from file 
    mainImage.setImageBitmap(mainBMP); // set the original bitmap in imageview 

    // create a blurred bitmap drawable and set it as background for linearlayout 
    BitmapDrawable drawable = new BitmapDrawable(getResources(), blur(mainBMP)); 
    mainBackground.setBackground(drawable); 


    registerForContextMenu(objectImage); 
    registerForContextMenu(textArea); 

} 

private void getImage(){ 
    String filename = getIntent().getStringExtra("image"); 
    try { 
     FileInputStream is = this.openFileInput(filename); 
     mainBMP = BitmapFactory.decodeStream(is); 
     is.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

@TargetApi(17) 
public Bitmap blur(Bitmap image) { 
    if (null == image) return null; 

    Bitmap outputBitmap = Bitmap.createBitmap(image); 
    final RenderScript renderScript = RenderScript.create(this); 
    Allocation tmpIn = Allocation.createFromBitmap(renderScript, image); 
    Allocation tmpOut = Allocation.createFromBitmap(renderScript, outputBitmap); 

    //Intrinsic Gausian blur filter 
    ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript)); 
    theIntrinsic.setRadius(BLUR_RADIUS); 
    theIntrinsic.setInput(tmpIn); 
    theIntrinsic.forEach(tmpOut); 
    tmpOut.copyTo(outputBitmap); 
    return outputBitmap; 
} 

Это, как я хочу, чтобы конечный результат будет: I want like this.

Но это то, что я получаю: I dont want this

Так как я делаю две копии того же растрового изображения, в котором один из них размытый, а другой есть прозрачный и оригинальный?

ответ

6

Проблема в том, как создается выходное растровое изображение. Вы используете вызов, который дает вам неизменяемый объект Bitmap на основе входного объекта Bitmap. Измените эту строку:

Bitmap outputBitmap = Bitmap.createBitmap(image); 

быть таким:

Bitmap outputBitmap = image.copy(image.getConfig(), true); 

Это даст вам отдельный Bitmap объект, который является копией оригинала и изменчиво. Прямо сейчас Renderscript действительно модифицирует оригинал (хотя он действительно должен потерпеть неудачу, потому что outputBitmap был неизменным.

+0

Это сделало это Спасибо. – AES

+0

Отлично, рад это слышать! –

Смежные вопросы