GLSurfaceView大小调整和黑条

时间:2016-03-11 11:18:59

标签: android android-layout android-bitmap glsurfaceview

我正在申请将过滤器应用于图片。我从android示例中获取代码,但是我在使用GLSurfaceView保存或转换为Bitmap时遇到了一些问题。

以下是保存到Bitmap的代码

private Bitmap createBitmapFromGLSurface(int x, int y, int w, int h, GL10 gl)
            throws OutOfMemoryError {

        int bitmapBuffer[] = new int[w * h];
        int bitmapSource[] = new int[w * h];
        IntBuffer intBuffer = IntBuffer.wrap(bitmapBuffer);
        intBuffer.position(0);
        try {
            gl.glReadPixels(0, 0, imageView.getWidth(), imageView.getHeight(), GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, intBuffer);
            int offset1, offset2;
            for (int i = 0; i < h; i++) {
                offset1 = i * w;
                offset2 = (h - i - 1) * w;
                for (int j = 0; j < w; j++) {
                    int texturePixel = bitmapBuffer[offset1 + j];
                    int blue = (texturePixel >> 16) & 0xff;
                    int red = (texturePixel << 16) & 0x00ff0000;
                    int pixel = (texturePixel & 0xff00ff00) | red | blue;
                    bitmapSource[offset2 + j] = pixel;
                }
            }
        } catch (GLException e) {
            return null;
        }

        return Bitmap.createBitmap(bitmapSource, w, h, Bitmap.Config.ARGB_8888);
    }

在这里你可以看到一个例子(上面和下面的黑条是多余的 Here you can see an example (black bars above and below is redundant

我试图改变GlSurfaceView的尺寸,然后摆脱黑条,但它只是去了#34; match_parent&#34;整天。 (我正在为宽度和高度准备好ImageView参数)

 ViewGroup.LayoutParams layoutParams=mEffectView.getLayoutParams();
 layoutParams.width=mImageViewWidth;
 layoutParams.height=mImageViewHeight;
 mEffectView.setLayoutParams(layoutParams);

此外,我尝试在创建Bitmap时添加一些偏移,但它都没有做任何事情,或者破坏了图像。 我该怎么做才能摆脱黑条? (它们也可以来自两侧) 感谢。

1 个答案:

答案 0 :(得分:0)

在调用此方法之前:

createBitmapFromGLSurface(0, 0, mEffectView.getWidth(), mEffectView.getHeight(), gl);

您只需将Height的{​​{1}}和Width设置为GLSurfaceView的{​​{1}}和Height即可。

Width
  

因此代码将类似于:

bitmap
  

更新:

在您的XML中,确保同时将runOnUiThread(new Runnable() { @Override public void run() { mEffectView.getLayoutParams().height = bitmapOriginal.getHeight(); mEffectView.getLayoutParams().width = bitmapOriginal.getWidth(); mEffectView.requestLayout(); } }); runOnUiThread(new Runnable() { @Override public void run() { mEffectView.getLayoutParams().height = bitmapOriginal.getHeight(); mEffectView.getLayoutParams().width = bitmapOriginal.getWidth(); mEffectView.requestLayout(); } }); createBitmapFromGLSurface(0, 0, mEffectView.getWidth(), mEffectView.getHeight(), gl); 的{​​{1}}设置为GLSurfaceView

希望这可以解决问题