2015-10-27 20 views
45

Şu anda BlendModes (Çıkar, Dışlama vb.), LauncherImage'ı maske olarak kullanır. Bu BlendMod'ları bir ColorMatrix'e uygulayabilir miyim?BlendModeFilter - ColorMatrix veya HexColor'u Kullan - Android?

Ben GPUImageLibrary

colorMatrix[ 
    0.393, 0.7689999, 0.18899999, 0, 0, 
    0.349, 0.6859999, 0.16799999, 0, 0, 
    0.272, 0.5339999, 0.13099999, 0, 0, 
    0,  0,   0,   1, 0]; 

SubtractBlendFilter.java

public class GPUImageSubtractBlendFilter extends GPUImageTwoInputFilter { 
public static final String SUBTRACT_BLEND_FRAGMENT_SHADER = "varying highp vec2 textureCoordinate;\n" + 
     " varying highp vec2 textureCoordinate2;\n" + 
     "\n" + 
     " uniform sampler2D inputImageTexture;\n" + 
     " uniform sampler2D inputImageTexture2;\n" + 
     " \n" + 
     " void main()\n" + 
     " {\n" + 
     " lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);\n" + 
     " lowp vec4 textureColor2 = texture2D(inputImageTexture2, textureCoordinate2);\n" + 
     "\n" + 
     " gl_FragColor = vec4(textureColor.rgb - textureColor2.rgb, textureColor.a);\n" + 
     " }"; 

public GPUImageSubtractBlendFilter() { 
    super(SUBTRACT_BLEND_FRAGMENT_SHADER); 
} 
} 

GPUIMageTwoInputFilter.java

Benim tahminim

public class GPUImageTwoInputFilter extends GPUImageFilter { 
private static final String VERTEX_SHADER = "attribute vec4 position;\n" + 
     "attribute vec4 inputTextureCoordinate;\n" + 
     "attribute vec4 inputTextureCoordinate2;\n" + 
     " \n" + 
     "varying vec2 textureCoordinate;\n" + 
     "varying vec2 textureCoordinate2;\n" + 
     " \n" + 
     "void main()\n" + 
     "{\n" + 
     " gl_Position = position;\n" + 
     " textureCoordinate = inputTextureCoordinate.xy;\n" + 
     " textureCoordinate2 = inputTextureCoordinate2.xy;\n" + 
     "}"; 

public int mFilterSecondTextureCoordinateAttribute; 
public int mFilterInputTextureUniform2; 
public int mFilterSourceTexture2 = OpenGlUtils.NO_TEXTURE; 
private ByteBuffer mTexture2CoordinatesBuffer; 
private Bitmap mBitmap; 

public GPUImageTwoInputFilter(String fragmentShader) { 
    this(VERTEX_SHADER, fragmentShader); 
} 

public GPUImageTwoInputFilter(String vertexShader, String fragmentShader) { 
    super(vertexShader, fragmentShader); 
    setRotation(Rotation.NORMAL, false, false); 
} 

@Override 
public void onInit() { 
    super.onInit(); 

    mFilterSecondTextureCoordinateAttribute = GLES20.glGetAttribLocation(getProgram(), "inputTextureCoordinate2"); 
    mFilterInputTextureUniform2 = GLES20.glGetUniformLocation(getProgram(), "inputImageTexture2"); // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader 
    GLES20.glEnableVertexAttribArray(mFilterSecondTextureCoordinateAttribute); 

    if (mBitmap != null&&!mBitmap.isRecycled()) { 
     setBitmap(mBitmap); 
    } 
} 

public void setBitmap(final Bitmap bitmap) { 
    if (bitmap != null && bitmap.isRecycled()) { 
     return; 
    } 
    mBitmap = bitmap; 
    if (mBitmap == null) { 
     return; 
    } 
    runOnDraw(new Runnable() { 
     public void run() { 
      if (mFilterSourceTexture2 == OpenGlUtils.NO_TEXTURE) { 
       if (bitmap == null || bitmap.isRecycled()) { 
        return; 
       } 
       GLES20.glActiveTexture(GLES20.GL_TEXTURE3); 
       mFilterSourceTexture2 = OpenGlUtils.loadTexture(bitmap, OpenGlUtils.NO_TEXTURE, false); 
      } 
     } 
    }); 
} 

public Bitmap getBitmap() { 
    return mBitmap; 
} 

public void recycleBitmap() { 
    if (mBitmap != null && !mBitmap.isRecycled()) { 
     mBitmap.recycle(); 
     mBitmap = null; 
    } 
} 

public void onDestroy() { 
    super.onDestroy(); 
    GLES20.glDeleteTextures(1, new int[]{ 
      mFilterSourceTexture2 
    }, 0); 
    mFilterSourceTexture2 = OpenGlUtils.NO_TEXTURE; 
} 

@Override 
protected void onDrawArraysPre() { 
    GLES20.glEnableVertexAttribArray(mFilterSecondTextureCoordinateAttribute); 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE3); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mFilterSourceTexture2); 
    GLES20.glUniform1i(mFilterInputTextureUniform2, 3); 

    mTexture2CoordinatesBuffer.position(0); 
    GLES20.glVertexAttribPointer(mFilterSecondTextureCoordinateAttribute, 2, GLES20.GL_FLOAT, false, 0, mTexture2CoordinatesBuffer); 
} 

public void setRotation(final Rotation rotation, final boolean flipHorizontal, final boolean flipVertical) { 
    float[] buffer = TextureRotationUtil.getRotation(rotation, flipHorizontal, flipVertical); 

    ByteBuffer bBuffer = ByteBuffer.allocateDirect(32).order(ByteOrder.nativeOrder()); 
    FloatBuffer fBuffer = bBuffer.asFloatBuffer(); 
    fBuffer.put(buffer); 
    fBuffer.flip(); 

    mTexture2CoordinatesBuffer = bBuffer; 
} 
} 
kullanıyorum String SUBTRACT_BLEND_GRAGMENT_SHADER & String VERTEX_SHADER ile bir şeyleri değiştirmeyi içerir.

+0

Yanlış anlaşılmadığım için özür dilerim, ama lütfen, girdi olarak hangi verilere sahip olduğunuzu ve çıktı olarak ne almak istediğinizi sağlayın. –

+0

Merhaba. Giriş olarak bir bitmapim var ve son çıktı da bir bitmap olmalıdır – Zen

+0

Tam olarak ne elde etmeye çalışıyorsunuz? Sorunuzu ew kez okumayı denedim, ancak gerekliliği anlayamadım. – codetiger

cevap

1

Renk matrisi, aynı pikseldeki geçerli renk bileşenlerinin doğrusal işlevleri olarak bazı pikseller için yeni renk bileşeni değerlerini tanımlayan varlıktır. Yani Renk matrisi dönüşümü için tek girdi, hangi renklerin dönüştürüleceği pikseldir. Bu dönüşüme başka bir piksel eklemenin bir yolu yoktur. Başka bir görüntüden veya dönüştürülmüş piksel komşularından olsalar bile, bu imkansızdır.

İlgili konular