如何显示使用OpenGL ES 2.0的Andr​​oid上的截图模糊的位图? [英] How to Display blurred bitmap of screenshot using opengl es 2.0 on android?

查看:328
本文介绍了如何显示使用OpenGL ES 2.0的Andr​​oid上的截图模糊的位图?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个应用程序,在Android中使用的OpenGL ES 2.0,即有pressing一个按钮,它会采取的截图,并会使用任何模糊算法中(这里快速模糊)罗嗦,并会显示模糊截图。开发这样的应用程序的唯一目的是尝试实行模糊。利用各种互联网资源我能采取的截图并实施模糊,但我不知道如何显示在OpenGL屏幕上模糊的位图。任何人都可以请帮我这个?提前致谢。
以下是我的主要活动:

I am trying to create an app, in android using opengl es 2.0, that has a button on pressing which it would take the screenshot and would blurr it using any blur algo (here Fast blur) and would display the blurred screenshot. The sole aim of developing such an app is to try and implement blurring. Using various internet resources i was able to take the screenshot and implement blurring but i dont know how to display the blurred bitmap on the screen in opengl. Can anyone please help me with this? Thanks in advance. Following is my Main activity:

package com.example.ankurtest;

import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class MainActivity extends Activity {
GLSurfaceView mView;
GLRendererEX myRenderer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //setContentView(mView);
    mView = (MyGLSurfaceview)findViewById(R.id.glSurfaceViewID);
    myRenderer = new GLRendererEX(this);

    mView.setEGLContextClientVersion(2);
    mView.setRenderer(myRenderer);
    myRenderer.queueDoSomethingNextTick(GLRendererEX.DO_THIS);

    findViewById(R.id.buttonID).setOnTouchListener(new OnTouchListener(){

       /* public void onTouch(MotionEvent event){
            myRenderer.queueDoSomethingNextTick(GLRendererEX.DO_THAT);
           // Compiler might complain about myRenderer not being final
        }*/

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_UP){
            myRenderer.queueDoSomethingNextTick(GLRendererEX.DO_THAT);
            return true;
            }
            return false;
        }
});
}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    mView.onPause();
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    mView.onResume();
}

    }

以下是我MyGLsurfaceview类:

Following is my MyGLsurfaceview class:

package com.example.ankurtest;

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.util.AttributeSet;

public class MyGLSurfaceview extends GLSurfaceView {

//private final GLRendererEX mRenderer;

public MyGLSurfaceview(Context context) {
    super(context);

    // Create an OpenGL ES 2.0 context.
    //setEGLContextClientVersion(2);

    // Set the Renderer for drawing on the GLSurfaceView
    //mRenderer = new GLRendererEX();
    //setRenderer(mRenderer);

    // Render the view only when there is a change in the drawing data
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
public MyGLSurfaceview(Context context, AttributeSet attrs)
{
  super(context, attrs);

  // Create an OpenGL ES 2.0 context.
  setEGLContextClientVersion(2);

  // Set the Renderer for drawing on the GLSurfaceView
  //mRenderer = new GLRendererEX();
  //setRenderer(mRenderer);
}

}

以下是我渲染器类:

Following is my Renderer class:

package com.example.ankurtest;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView.Renderer;
import android.os.Build;
import android.view.Display;
import android.view.WindowManager;

@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
public class GLRendererEX implements Renderer{

private final Context context;

private int command;
public static final int DO_THIS = 1;
public static final int DO_THAT = 2;


public GLRendererEX(Context activitycontext) {
    context = activitycontext;

}


public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    GLES20.glClearColor(0.8f, 0.0f, 0.2f, 1f);

    // TODO Auto-generated method stub

}
@Override
public void onDrawFrame(GL10 gl) {

    if (command==DO_THAT) {
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

        Point size = new Point();
        WindowManager wm = (WindowManager)  context.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        //myactivity.getWindowManager().getDefaultDisplay().getSize(size);
        display.getSize(size);
        int width = size.x; // use your favorite width
        int height = size.y; // use your favorite height
        int screenshotSize = width * height;
        ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4);
        bb.order(ByteOrder.nativeOrder());
        GLES20.glReadPixels(0, 0, width, height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, bb);
        int pixelsBuffer[] = new int[screenshotSize];
        bb.asIntBuffer().get(pixelsBuffer);
        bb = null;

        for (int i = 0; i < screenshotSize; ++i) {
            // The alpha and green channels' positions are preserved while the      red and blue are swapped
            pixelsBuffer[i] = ((pixelsBuffer[i] & 0xff00ff00)) |    ((pixelsBuffer[i] & 0x000000ff) << 16) | ((pixelsBuffer[i] & 0x00ff0000) >> 16);
        }

        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bitmap.setPixels(pixelsBuffer, screenshotSize-width, -width, 0, 0, width, height);
Bitmap fast = Fastblur(bitmap,10);
        command = DO_THIS;
    }
    // TODO Auto-generated method stub

}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
    // TODO Auto-generated method stub

}

public void queueDoSomethingNextTick(int command){

    this.command = command;

}

}

在这里Fastblur()方法用于模糊的截图,并返回模糊的截图。现在,我的问题是如何使用的OpenGL显示)由Fastblur(返回的位图?

Herein Fastblur() method is used to blur the screenshot and it returns the blurred screenshot. Now, my question is how to display the bitmap returned by Fastblur() using opengl?

推荐答案

显示全尺寸图像的常用方法是使用正交投影矩阵:

The common method to display a full sized image is to use an orthogonal projection matrix:

(例如使用固定功能)

GLES20.glViewport(0, 0, windowWidth, windowHeight);
GLES20.glMatrixMode(GL_PROJECTION);
GLES20.glLoadIdentity();
GLES20.glOrtho(-1, 1, -1, 1, 1, -1);

而不是拉伸全屏四与绑定为的Texture2D图像。

than draw a fullscreen quad with your image bound as texture2D.

基本质地教程这里

基本四教程这里

一套四坐标如下:

static float squareCoords[] = {
        -1f, -1f, 0.0f,   // top left
        -1f, 1f, 0.0f,   // bottom left
         1f, 1f, 0.0f,   // bottom right
         1f, -1f, 0.0f }; // top right

这篇关于如何显示使用OpenGL ES 2.0的Andr​​oid上的截图模糊的位图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆