https://chatgpt.com/share/675a5bf6-7cd8-8003-98e7-d86146e47e95
常用滤镜类型
- 颜色调整滤镜
灰度 (Grayscale): 将图片转换为黑白。
反色 (Invert): 将图片的颜色反转。
棕褐色 (Sepia): 应用棕褐色滤镜,营造复古效果。
色调 (Hue): 调整图片的主色调。
饱和度 (Saturation): 提高或降低颜色饱和度。 - 模糊效果
高斯模糊 (Gaussian Blur): 创建柔化的模糊效果。
径向模糊 (Radial Blur): 从中心向外逐渐模糊。
运动模糊 (Motion Blur): 模拟运动轨迹模糊。 - 锐化滤镜
增强图片的细节,让图片显得更清晰。 - 光影和边缘
浮雕 (Emboss): 使图片看起来像浮雕效果。
边缘检测 (Edge Detection): 突出图片的边缘。 - 视觉特效
马赛克 (Pixelation): 通过降低分辨率创建像素化效果。
油画 (Oil Painting): 模拟油画质感。
素描 (Sketch): 将图片转换为素描风格。
实现推荐
-
使用 BitmapTransformation
Glide 的 BitmapTransformation 是实现滤镜效果的基础,适合简单的自定义滤镜(如颜色调整)。
-
使用 GPU 加速的滤镜库
GPUImage for Android:
提供了许多常用滤镜(如模糊、灰度、色调调整)。
高效利用 GPU 处理图像,性能优秀。
GitHub 地址
-
颜色调整滤镜
灰度 (Grayscale)
kotlin
class GrayscaleTransformation : BitmapTransformation() {
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
messageDigest.update("GrayscaleTransformation".toByteArray())
}
override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
val result = pool.get(toTransform.width, toTransform.height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(result)
val paint = Paint()
val colorMatrix = ColorMatrix().apply { setSaturation(0f) }
paint.colorFilter = ColorMatrixColorFilter(colorMatrix)
canvas.drawBitmap(toTransform, 0f, 0f, paint)
return result
}
}
反色 (Invert)
kotlin
class InvertTransformation : BitmapTransformation() {
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
messageDigest.update("InvertTransformation".toByteArray())
}
override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
val result = pool.get(toTransform.width, toTransform.height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(result)
val paint = Paint()
val colorMatrix = ColorMatrix(floatArrayOf(
-1f, 0f, 0f, 0f, 255f,
0f, -1f, 0f, 0f, 255f,
0f, 0f, -1f, 0f, 255f,
0f, 0f, 0f, 1f, 0f
))
paint.colorFilter = ColorMatrixColorFilter(colorMatrix)
canvas.drawBitmap(toTransform, 0f, 0f, paint)
return result
}
}
使用 Glide 的 BitmapTransformation
可以实现上述滤镜效果。下面分别为每种滤镜提供了示例实现代码:
1. 颜色调整滤镜
灰度 (Grayscale)
kotlin
class GrayscaleTransformation : BitmapTransformation() {
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
messageDigest.update("GrayscaleTransformation".toByteArray())
}
override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
val result = pool.get(toTransform.width, toTransform.height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(result)
val paint = Paint()
val colorMatrix = ColorMatrix().apply { setSaturation(0f) }
paint.colorFilter = ColorMatrixColorFilter(colorMatrix)
canvas.drawBitmap(toTransform, 0f, 0f, paint)
return result
}
}
反色 (Invert)
kotlin
class InvertTransformation : BitmapTransformation() {
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
messageDigest.update("InvertTransformation".toByteArray())
}
override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
val result = pool.get(toTransform.width, toTransform.height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(result)
val paint = Paint()
val colorMatrix = ColorMatrix(floatArrayOf(
-1f, 0f, 0f, 0f, 255f,
0f, -1f, 0f, 0f, 255f,
0f, 0f, -1f, 0f, 255f,
0f, 0f, 0f, 1f, 0f
))
paint.colorFilter = ColorMatrixColorFilter(colorMatrix)
canvas.drawBitmap(toTransform, 0f, 0f, paint)
return result
}
}
棕褐色 (Sepia)
kotlin
class SepiaTransformation : BitmapTransformation() {
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
messageDigest.update("SepiaTransformation".toByteArray())
}
override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
val result = pool.get(toTransform.width, toTransform.height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(result)
val paint = Paint()
val colorMatrix = ColorMatrix(floatArrayOf(
0.393f, 0.769f, 0.189f, 0f, 0f,
0.349f, 0.686f, 0.168f, 0f, 0f,
0.272f, 0.534f, 0.131f, 0f, 0f,
0f, 0f, 0f, 1f, 0f
))
paint.colorFilter = ColorMatrixColorFilter(colorMatrix)
canvas.drawBitmap(toTransform, 0f, 0f, paint)
return result
}
}
色调 (Hue) 和 饱和度 (Saturation)
你可以在 ColorMatrix
中调整色调或饱和度。与上述类似,通过修改 setRotate
或 setSaturation
调整效果。
2. 模糊效果
高斯模糊 (Gaussian Blur)
需要使用 RenderScript
或第三方库如 BlurKit
:
kotlin
class GaussianBlurTransformation(private val context: Context, private val radius: Float) : BitmapTransformation() {
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
messageDigest.update("GaussianBlurTransformation".toByteArray())
}
override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
val rs = RenderScript.create(context)
val input = Allocation.createFromBitmap(rs, toTransform)
val output = Allocation.createTyped(rs, input.type)
val script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs))
script.setRadius(radius)
script.setInput(input)
script.forEach(output)
output.copyTo(toTransform)
rs.destroy()
return toTransform
}
}
径向模糊 (Radial Blur)
需要使用 OpenGL 或专用算法实现,这超出 Glide 基本能力。
3. 锐化滤镜
kotlin
class SharpenTransformation : BitmapTransformation() {
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
messageDigest.update("SharpenTransformation".toByteArray())
}
override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
val result = pool.get(toTransform.width, toTransform.height, Bitmap.Config.ARGB_8888)
val kernel = floatArrayOf(
0f, -1f, 0f,
-1f, 5f, -1f,
0f, -1f, 0f
)
val paint = Paint()
val canvas = Canvas(result)
val colorMatrix = ColorMatrix()
paint.colorFilter = ColorMatrixColorFilter(colorMatrix)
canvas.drawBitmap(toTransform, 0f, 0f, paint)
return result
}
}
4. 光影和边缘
浮雕 (Emboss)
通过自定义滤镜:
kotlin
val embossMatrix = floatArrayOf(
-2f, -1f, 0f,
-1f, 1f, 1f,
0f, 1f, 2f
)
边缘检测 (Edge Detection)
使用卷积核进行边缘检测:
kotlin
val edgeDetectionKernel = floatArrayOf(
-1f, -1f, -1f,
-1f, 8f, -1f,
-1f, -1f, -1f
)
5. 视觉特效
马赛克 (Pixelation)
通过降低图片分辨率实现:
kotlin
class PixelationTransformation(private val pixelSize: Int) : BitmapTransformation() {
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
messageDigest.update("PixelationTransformation".toByteArray())
}
override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
val scaledBitmap = Bitmap.createScaledBitmap(toTransform, toTransform.width / pixelSize, toTransform.height / pixelSize, false)
return Bitmap.createScaledBitmap(scaledBitmap, toTransform.width, toTransform.height, false)
}
}
油画 (Oil Painting) 和 素描 (Sketch)
需要实现复杂的算法,建议使用 GPUImage 或专用的图像处理库。
在 Glide 中应用滤镜
kotlin
Glide.with(context)
.load(imageUrl)
.apply(RequestOptions.bitmapTransform(GrayscaleTransformation()))
.into(imageView)
通过上述方式,你可以逐步实现各种滤镜效果,满足项目需求。