Как создать «Микшер каналов», такой как Photoshop, используя библиотеку Android GPUImage - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть несколько эффектов фильтра изображений в Photoshop, которые содержат Color Blend, Color balance, Curve, Level и Channel Mixer.Все, что я могу достичь с помощью Android GPUImage, за исключением Channel Mixer, я не вижу никакой реализации для него из библиотеки.У кого-нибудь есть идеи, как имитировать микшер каналов?Заранее большое спасибо!

Редактировать :

Эффект, как показано ниже

enter image description here

Только Channel Mixer. Я не знаю, как это сделать с Android GPUImage, другие, как Curve, Color Fill, Color Balance и Level I, с Android GPUImage, как показано ниже:

class GPUImageVintageLook(context: Context) : GPUImageFilterGroup() {
private val colorFilter1 = GPUFilterUtils.createColorBlendFilter(
    GPUImageExclusionBlendFilter::class.java,
    Color.rgb(11, 5, 43)
)
private val colorFilter2 = GPUFilterUtils.createColorBlendFilter(
    GPUImageMultiplyBlendFilter::class.java,
    Color.rgb(255, 234, 197)
)
private val curve = GPUImageToneCurveFilter().apply {
    setFromCurveFileInputStream(context.resources.openRawResource(R.raw.tone_curve_vintage_look))
}
private val colorBalance = GPUImageColorBalanceFilter().apply {
    setMidtones(floatArrayOf(13f/100, -12f/100, -5f/100))
    setHighlights(floatArrayOf(-2f/100, -5f/100, 1f/100))
    setShowdows(floatArrayOf(8f/100, -8f/100, -5f/100))
}
private val channelMixer = GPUImageFilter().apply {
    //This is just empty filter, I don't know how to achieve
}
private val colorFilter3 = GPUFilterUtils.createColorBlendFilter(
    GPUImageSoftLightBlendFilter::class.java,
    Color.rgb(242, 236, 174)
)
private val level = GPUImageLevelsFilter().apply {
    setMin(22f, 1f, 244f, 0f, 255f)
}
private val colorFilter4 = GPUFilterUtils.createColorBlendFilter(
    GPUImageLightenBlendFilter::class.java,
    Color.rgb(112, 50, 87)
)

init {
    addFilter(colorFilter1)
    addFilter(colorFilter2)
    addFilter(curve)
    addFilter(colorBalance)
    addFilter(channelMixer) // Missing this
    addFilter(colorFilter3)
    addFilter(level)
    addFilter(colorFilter4)
}
}

Цветblend:

fun createColorBlendFilter(
    filterClass: Class<out GPUImageTwoInputFilter>,
    inColor: Int? = null
): GPUImageFilter {
    return try {
        filterClass.newInstance()
            .apply {
                if (inColor != null) {
                    bitmap = createColorBitmap(inColor)
                }
            }
    } catch (e: Exception) {
        e.printStackTrace()
        GPUImageFilter()
    }
}

fun createColorBitmap(color: Int) : Bitmap {
    return Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888).apply {
        eraseColor(color)
    }
}

Я тестировал другие фильтры, работающие так же, как Photoshop, когда включал и выключал каждый из них.Просто нужен последний микшер канала.

...