永久模糊更改位图
Blur changing bitmap permanently
我有一个搜索栏,在搜索栏发生变化时,我 运行 这个用于模糊位图的异步任务;所以,基本上,当我将搜索栏向右移动时,位图应该更加模糊,而当向左移动时,模糊应该更少。但是当我开始移动我的搜索栏位图时,即使我将它向左移动,它也会变得越来越模糊,模糊半径减小。从代码中可以看出,我从不更改 "mainBitmap" 但是当我调试应用程序时,我看到 activity.mainBitmap 发生了变化,这就是为什么搜索栏移动会逐渐模糊位图的原因。
知道我在这里犯了什么错误吗。
提前致谢!
private final class Blur extends AsyncTask<Integer, Void, Bitmap> {
@Override
protected void onPreExecute(){
activity.showProgressBar();
}
@Override
protected Bitmap doInBackground(Integer... params) {
Bitmap bitmap = activity.mainBitmap;
Bitmap outputBitmap = Bitmap.createBitmap(bitmap);
RenderScript renderScript = RenderScript.create(activity);
Allocation tmpIn = Allocation.createFromBitmap(renderScript, bitmap);
Allocation tmpOut = Allocation.createFromBitmap(renderScript, outputBitmap);
//Intrinsic Gaussian blur filter
ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript));
theIntrinsic.setRadius(params[0]);
theIntrinsic.setInput(tmpIn);
theIntrinsic.forEach(tmpOut);
tmpOut.copyTo(outputBitmap);
return outputBitmap;
}
@Override
protected void onPostExecute(Bitmap newBit) {
activity.hideProgressBar();
activity.mainImage.setImageBitmap(newBit);
}
您只是传递了 mainBitmap
的 reference
这就是 mainBitmap
发生变化的原因。你应该复制它然后模糊它。
而不是
Bitmap bitmap = activity.mainBitmap;
你应该使用:
Bitmap bitmap = activity.mainBitmap.copy(activity.mainBitmap.getConfig(),true);
与其在 onSeekChange 中为每个值一次又一次地创建位图,不如
这将通过 OutOfMemoryException
按照以下步骤操作
- 创建一个完全模糊的图像
- 在您的主图像上再添加一个图像视图,并将其上的模糊位图设置为叠加层,并将其 alpha 设置为 0,即完全透明。
- 现在,当用户移动搜索栏时,尝试更改叠加模糊图像的 alpha。
我有一个搜索栏,在搜索栏发生变化时,我 运行 这个用于模糊位图的异步任务;所以,基本上,当我将搜索栏向右移动时,位图应该更加模糊,而当向左移动时,模糊应该更少。但是当我开始移动我的搜索栏位图时,即使我将它向左移动,它也会变得越来越模糊,模糊半径减小。从代码中可以看出,我从不更改 "mainBitmap" 但是当我调试应用程序时,我看到 activity.mainBitmap 发生了变化,这就是为什么搜索栏移动会逐渐模糊位图的原因。
知道我在这里犯了什么错误吗。
提前致谢!
private final class Blur extends AsyncTask<Integer, Void, Bitmap> {
@Override
protected void onPreExecute(){
activity.showProgressBar();
}
@Override
protected Bitmap doInBackground(Integer... params) {
Bitmap bitmap = activity.mainBitmap;
Bitmap outputBitmap = Bitmap.createBitmap(bitmap);
RenderScript renderScript = RenderScript.create(activity);
Allocation tmpIn = Allocation.createFromBitmap(renderScript, bitmap);
Allocation tmpOut = Allocation.createFromBitmap(renderScript, outputBitmap);
//Intrinsic Gaussian blur filter
ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript));
theIntrinsic.setRadius(params[0]);
theIntrinsic.setInput(tmpIn);
theIntrinsic.forEach(tmpOut);
tmpOut.copyTo(outputBitmap);
return outputBitmap;
}
@Override
protected void onPostExecute(Bitmap newBit) {
activity.hideProgressBar();
activity.mainImage.setImageBitmap(newBit);
}
您只是传递了 mainBitmap
的 reference
这就是 mainBitmap
发生变化的原因。你应该复制它然后模糊它。
而不是
Bitmap bitmap = activity.mainBitmap;
你应该使用:
Bitmap bitmap = activity.mainBitmap.copy(activity.mainBitmap.getConfig(),true);
与其在 onSeekChange 中为每个值一次又一次地创建位图,不如 这将通过 OutOfMemoryException
按照以下步骤操作 - 创建一个完全模糊的图像 - 在您的主图像上再添加一个图像视图,并将其上的模糊位图设置为叠加层,并将其 alpha 设置为 0,即完全透明。 - 现在,当用户移动搜索栏时,尝试更改叠加模糊图像的 alpha。