kotlin 图片浮雕处理

浮雕效果实现原理:

算法原理:用前一个像素点的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程序员必须掌握 这篇文章中的线程优化部分。

三、效果图

图片浮雕效果

猜你喜欢

转载自blog.csdn.net/dhl91604/article/details/76922726