在位图上应用多重效果而不保存
Apply multiple effect on bitmap without saving it
我的要求是在位图上加载多个效果。我正在关注 apply-effects-on-image-using-effects。我成功应用了效果,但我的要求是单独提供亮度效果。这意味着用户无需保存文件即可在应用任何其他效果后提供亮度效果。
我知道在保存文件并再次渲染该文件后可以实现。但是我需要它而不保存图像文件。
现在,如果我在任何应用的效果上应用亮度,应用的效果就会消失,亮度会显示其效果。这是因为下面的代码:
mEffect = effectFactory.createEffect(EffectFactory.EFFECT_BRIGHTNESS);
此处,mEffect 总是初始化以赋予新的纹理效果。没有它我无法加载效果。
所以,我的问题是,如何在不保存的情况下在同一纹理上加载多个效果。
创建 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
}
}
}
我的要求是在位图上加载多个效果。我正在关注 apply-effects-on-image-using-effects。我成功应用了效果,但我的要求是单独提供亮度效果。这意味着用户无需保存文件即可在应用任何其他效果后提供亮度效果。
我知道在保存文件并再次渲染该文件后可以实现。但是我需要它而不保存图像文件。
现在,如果我在任何应用的效果上应用亮度,应用的效果就会消失,亮度会显示其效果。这是因为下面的代码:
mEffect = effectFactory.createEffect(EffectFactory.EFFECT_BRIGHTNESS);
此处,mEffect 总是初始化以赋予新的纹理效果。没有它我无法加载效果。
所以,我的问题是,如何在不保存的情况下在同一纹理上加载多个效果。
创建 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
}
}
}