在位图上应用多个效果而不保存它

时间:2015-06-04 13:18:57

标签: android image-processing bitmap textures effect

我的要求是在位图上加载多个效果。我正在关注apply-effects-on-image-using-effects。我成功应用了效果,但我的要求是分别给出亮度效果。这意味着用户可以在应用任何其他效果后无需保存文件即可提供亮度效果。

我知道保存文件并再次渲染该文件后就可以了。但我需要它而不保存图像文件。

现在,如果我对任何应用效果应用亮度,则应用的效果消失,亮度显示其效果。这是因为下面的代码:

mEffect = effectFactory.createEffect(EffectFactory.EFFECT_BRIGHTNESS);

此处, mEffect 始终初始化以对纹理赋予新效果。没有它,我无法加载效果。

所以,我的问题是,如何在不保存的情况下在同一纹理上加载多个效果。

1 个答案:

答案 0 :(得分:2)

创建3个纹理,而不是2:

private int[] mTextures = new int[3];

private void loadTextures() {
    // Generate textures
    GLES20.glGenTextures(3, mTextures, 0);
    ...

之后,您可以依次应用两种效果:

private void applyEffect() {
    if (mNeedSecondEffect) {
       mEffect.apply(mTextures[0], mImageWidth, mImageHeight, mTextures[2]);
       mSecondEffect.apply(mTextures[2], mImageWidth, mImageHeight, mTextures[1]);
    } else {
       mEffect.apply(mTextures[0], mImageWidth, mImageHeight, mTextures[1]);
    }
}

使用2种纹理效果,您可以应用任意数量的效果级联,更改源和目​​标纹理。

编辑对于多重效果,请尝试以下操作:

让我们想象你有一系列效果级联

 Effect mEffectArray[] = ...; // the effect objects to be applied
 int mEffectCount = ... ; // number of effects used right now for output 

然后您的 applyEffect()方法将是这样的:

private void applyEffect() {
    if (mEffectCount > 0) { // if there is any effect
        mEffectArray[0].apply(mTextures[0], mImageWidth, mImageHeight, mTextures[1]); // apply first effect
        for (int i = 1; i < mEffectCount; i++) { // if more that one effect
            int sourceTexture = mTextures[1]; 
            int destinationTexture = mTextures[2];
            mEffectArray[i].apply(sourceTexture, mImageWidth, mImageHeight, destinationTexture);
            mTextures[1] = destinationTexture; // changing the textures array, so 1 is always the texture for output, 
            mTextures[2] = sourceTexture; // 2 is always the sparse texture
        }
    }
}