I am trying to use RenderScript to create a blurred bitmap to set it as a background for a LinearLayout which contains an ImageView . I also want a clear original copy of the bitmap so that I can set it as an image in the ImageView .
Here's my code:
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;
}
This is how I want the final result to be:
So how do I make two copies of the same bitmap in which one of them is blurred and the other is clear and original ?
The problem is with how the output bitmap is being created. You're using a call that gives you an immutable Bitmap
object based on an input Bitmap
object. Change this line:
Bitmap outputBitmap = Bitmap.createBitmap(image);
to be this:
Bitmap outputBitmap = image.copy(image.getConfig(), true);
That will give you a separate Bitmap
object which is a copy of the original and mutable. Right now Renderscript is really modifying the original (though it really should fail because the outputBitmap
was immutable.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.