浮雕效果实现原理:
算法原理:用前一个像素点的RGB值分别减去当前像素点的RGB值并加上127作为当前像素点的RGB值。
例: ABC代表三个连续像素点, 求B点的浮雕效果如下:
B.a = C.a - B.a + 127;
B.r = C.r - B.r + 127;
B.g = C.g - B.g + 127;
B.b = C.b - B.b + 127;
注意RGB值在0~255之间。
一、什么都不说了,直接上代码
/**
* 对相片进行浮雕处理
*/
private fun reliefImage(): Bitmap {
val bm = BitmapFactory.decodeResource(resources, R.drawable.a)
val width = bm.width
val height = bm.height
val size = width * height
val bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
var newPixels = IntArray(size)
var oldPixels = IntArray(size)
bm.getPixels(oldPixels, 0, width, 0, 0, width, height)
for (i in 1..size - 1) {
//前一个像素
val preColor = oldPixels[i - 1]
var preA = Color.alpha(preColor)
var preR = Color.red(preColor)
var preG = Color.green(preColor)
var preB = Color.blue(preColor)
//后一个像素
val nextColor = oldPixels[i]
val newA = Color.alpha(nextColor)
val newR = Color.red(nextColor)
val newG = Color.green(nextColor)
val newB = Color.blue(nextColor)
preA = (preA - newA + 127)
preR = (preR - newR + 127)
preG = (preG - newG + 127)
preB = (preB - newB + 127)
if (preA > 255) {
preA = 255
}
if (preR > 255) {
preR = 255
}
if (preG > 255) {
preG = 255
}
if (preB > 255) {
preB = 255
}
newPixels[i] = Color.argb(preA, preR, preG, preB)
}
bmp.setPixels(newPixels, 0, width, 0, 0, width, height)
return bmp
}
二、获取处理后的Bitmap
val bm = XThread.submit(Callable<Bitmap> {
return@Callable reliefImage()
})
imageView!!.setImageBitmap(bm)
注意:这里的XThread,是自己写的线程池执行线程后,获取返回值。
详情参见:Android APP优化—Android程序员必须掌握 这篇文章中的线程优化部分。