我尝试使用 Glide 显示模糊图像,但显示错误图像。我不知道为什么显示错误图像。 URL 可以正常工作,但仍然它只显示错误图片
这是我的代码
Glide.with(context)
.load("http://www.gadgetsaint.com/wp-content/uploads/2016/11/cropped-web_hi_res_512.png")
.diskCacheStrategy(DiskCacheStrategy.NONE)
.bitmapTransform(new BlurTransformation(context))
.error(R.drawable.error_image)
.into(imageView);
BlurTransformation类:
public class BlurTransformation extends BitmapTransformation {
private RenderScript rs;
public BlurTransformation(Context context) {
super(context);
rs = RenderScript.create(context);
}
@SuppressLint("NewApi")
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
Bitmap blurredBitmap = toTransform.copy(Bitmap.Config.ARGB_8888, true);
// Allocate memory for Renderscript to work with
Allocation input = Allocation.createFromBitmap(
rs,
blurredBitmap,
Allocation.MipmapControl.MIPMAP_FULL,
Allocation.USAGE_SHARED
);
Allocation output = Allocation.createTyped(rs, input.getType());
// Load up an instance of the specific script that we want to use.
ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
script.setInput(input);
// Set the blur radius
script.setRadius(100);
// Start the ScriptIntrinisicBlur
script.forEach(output);
// Copy the output to the blurred bitmap
output.copyTo(blurredBitmap);
toTransform.recycle();
return blurredBitmap;
}
@Override
public String getId() {
return "blur";
}
}
答案 0 :(得分:1)
答案 1 :(得分:1)
也许有人会有用,最新版本-仅Glide:
-添加到应用gradle:
implementation("com.github.bumptech.glide:glide:4.9.0") {
exclude group: "com.android.support"
}
kapt 'com.github.bumptech.glide:compiler:4.9.0'
-在您的布局中:
<ImageView
android:id="@+id/ivBlurred"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
tools:ignore="ContentDescription" />
-在课堂上,您在其中添加图片:
Glide.with(context)
.asBitmap()
.load(R.drawable.temp_full_screen_image) // or url
.transform(BlurTransformation(context))
.into(ivBlurred)
-最后:
import android.content.Context
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.renderscript.*
import android.renderscript.RenderScript.RSMessageHandler
import androidx.annotation.ColorInt
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool
import com.bumptech.glide.load.resource.bitmap.BitmapResource
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation
import java.security.MessageDigest
private const val DEFAULT_DOWN_SAMPLING = 0.5f
class BlurTransformation(private val context: Context) : BitmapTransformation() {
override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap? {
val source: Bitmap = toTransform
val scaledWidth = (source.width * DEFAULT_DOWN_SAMPLING).toInt()
val scaledHeight = (source.height * DEFAULT_DOWN_SAMPLING).toInt()
val bitmap = pool[scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888]
return BitmapResource.obtain(this.blurBitmap(context, source, bitmap, Color.argb(90, 255, 255, 255)), pool)?.get()
}
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
messageDigest.update("blur transformation".toByteArray())
}
@Synchronized
fun blurBitmap(context: Context, source: Bitmap?, bitmap: Bitmap, @ColorInt colorOverlay: Int): Bitmap? {
if (source == null) return bitmap
Canvas(bitmap).apply {
scale(DEFAULT_DOWN_SAMPLING, DEFAULT_DOWN_SAMPLING)
drawBitmap(source, 0f, 0f, Paint().apply {
flags = Paint.FILTER_BITMAP_FLAG
})
drawColor(colorOverlay)
}
return try {
blur(context, bitmap)
} catch (e: RSRuntimeException) {
e.printStackTrace()
bitmap
}
}
@Throws(RSRuntimeException::class)
private fun blur(context: Context, bitmap: Bitmap): Bitmap {
var rs: RenderScript? = null
var input: Allocation? = null
var output: Allocation? = null
var blur: ScriptIntrinsicBlur? = null
try {
rs = RenderScript.create(context)
rs.messageHandler = RSMessageHandler()
input = Allocation.createFromBitmap(rs, bitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT)
output = Allocation.createTyped(rs, input.type)
blur = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)).apply {
setInput(input)
setRadius(25f)
forEach(output)
}
output.copyTo(bitmap)
} finally {
rs?.destroy()
input?.destroy()
output?.destroy()
blur?.destroy()
}
return bitmap
}
}
答案 2 :(得分:0)
对于Glide V3,
Glide.with(context).load(imagePath).transform(new BlurTransformation(context))
.into(imageView);
我正在使用此类进行模糊变换
public class BlurTransformation extends BitmapTransformation {
private RenderScript rs;
public BlurTransformation(Context context) {
super( context );
rs = RenderScript.create( context );
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
Bitmap blurredBitmap = toTransform.copy( Bitmap.Config.ARGB_8888, true );
// Allocate memory for Renderscript to work with
Allocation input = Allocation.createFromBitmap(
rs,
blurredBitmap,
Allocation.MipmapControl.MIPMAP_FULL,
Allocation.USAGE_SHARED
);
Allocation output = Allocation.createTyped(rs, input.getType());
// Load up an instance of the specific script that we want to use.
ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
script.setInput(input);
// Set the blur radius
script.setRadius(10);
// Start the ScriptIntrinisicBlur
script.forEach(output);
// Copy the output to the blurred bitmap
output.copyTo(blurredBitmap);
toTransform.recycle();
return blurredBitmap;
}
@Override
public String getId() {
return "blur";
}
}