首页 > 解决方案 > 一组渲染脚本过滤器如何使用搜索栏进行调整

问题描述

我想用渲染脚本过滤器喜欢这个,下面给出了一个示例 gif

我的问题 在我的代码中,我的代码中的所有渲染脚本过滤器都运行良好,但问题是当我更改过滤器然后重新设置位图然后使用位图更新过滤器值时。

class Filters(private val context: Context)   {
        private val TAG = BrightnessFilter::class.java.simpleName
    
    
        private var rs: RenderScript = RenderScript.create(context)
    
         private var brightnessScript: ScriptC_brightness = ScriptC_brightness(rs)
    
        private var contrastScript: ScriptC_contrast = ScriptC_contrast(rs)
    
        private var saturationFilter: ScriptC_saturation = ScriptC_saturation(rs)
    
        private var convolution: ScriptIntrinsicConvolve3x3 =
            ScriptIntrinsicConvolve3x3.create(rs, Element.U8_4(rs))
    
        private var vignetteFilter: ScriptC_vignette = ScriptC_vignette(rs)

  fun setBrightnessX(values: Float, inputImage: Bitmap): Bitmap {
        val outBitmap = Bitmap.createBitmap(inputImage)
        val tempIn = Allocation.createFromBitmap(rs, inputImage)
        val tempOut = Allocation.createFromBitmap(rs, outBitmap)

        brightnessScript.invoke_setBright(values)
        brightnessScript.forEach_brightness(tempIn, tempOut)

        tempOut.copyTo(outBitmap)
        return outBitmap

    }

    fun setContrastX(contrast: Float, inputImage: Bitmap): Bitmap {
        val outBitmap = Bitmap.createBitmap(inputImage)
        val tempIn = Allocation.createFromBitmap(rs, inputImage)
        val tempOut = Allocation.createFromBitmap(rs, outBitmap)

        contrastScript._contrast = contrast
         contrastScript.forEach_contrastness(tempIn, tempOut)

        tempOut.copyTo(outBitmap)
        tempIn.destroy()
        tempOut.destroy()
        return outBitmap

    }

    fun setSaturationX(saturation: Float, inputImage: Bitmap): Bitmap {
        val outBitmap = Bitmap.createBitmap(inputImage)
        val tempIn = Allocation.createFromBitmap(rs, inputImage)
        val tempOut = Allocation.createFromBitmap(rs, outBitmap)

        saturationFilter._saturationValue = saturation
        saturationFilter.forEach_saturation(tempIn, tempOut)

        tempOut.copyTo(outBitmap)
        tempIn.destroy()
        tempOut.destroy()
        return outBitmap

    }


    fun sharpenX(sharpen: Float, bitmap: Bitmap): Bitmap {

        val matrix = floatArrayOf(
            0f, -sharpen, 0f,
            -sharpen, 1 + 4 * sharpen, -sharpen,
            0f, -sharpen, 0f
        )

        return applySharpenConvolveX(bitmap, matrix)
    }


    private fun applySharpenConvolveX(inputImage: Bitmap, coefficients: FloatArray): Bitmap {
        val outBitmap = Bitmap.createBitmap(inputImage)
        val tempIn = Allocation.createFromBitmap(rs, inputImage)
        val tempOut = Allocation.createFromBitmap(rs, outBitmap)

        convolution.setInput(tempIn)
        convolution.setCoefficients(coefficients)
        convolution.forEach(tempOut)

        tempOut.copyTo(outBitmap)
        return outBitmap

    }


    fun vignetteX(values: Float, inputImage: Bitmap): Bitmap {

        vignetteFilter.setScale(values)
        return vignetteFilter.x(inputImage)

    }

}

对于滑块值更改currentFilter被调用并更新输出位ImageView

private fun currentFilter(values: Float): Bitmap {

        return when (_recentTab.value!!) {

            FilterName.BRIGHTNESS -> _filter.value!!.setBrightnessX(values, mInputImage)
            FilterName.CONTRAST -> _filter.value!!.setContrastX(values, mInputImage)
            FilterName.SATURATION -> _filter.value!!.setSaturationX(values, mInputImage)
            FilterName.SHARPEN -> _filter.value!!.sharpenX(values, mInputImage)
            FilterName.VIGNETTE -> _filter.value!!.vignetteX(values, mInputImage)

        }
    }

标签: androidkotlinimage-processingrenderscript

解决方案


推荐阅读