Android相机和着色器效果

时间:2016-10-07 09:54:11

标签: android opengl-es-2.0

我正在使用Android相机应用程序,它使用顶点着色器将各种失真效果应用于相机预览。虽然相机预览显示所需的效果,但图片不会。如何让图片/图像显示与相机预览相同的效果?我希望我的问题很清楚。非常感谢期待。

代码提取如下:

相机活动:

public class CameraActivity extends Activity implements SurfaceTexture.OnFrameAvailableListener{

@SuppressWarnings("deprecation")
private Camera mCamera;
private PreviewCallback mPreviewCallback;
private MyGLSurfaceView glSurfaceView;
private SurfaceTexture surface;
MyGL20Renderer renderer;
public boolean mFrameAvailable = false;
public static final int MEDIA_TYPE_IMAGE = 1;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);



    setContentView(R.layout.screen);

    FrameLayout surface = (FrameLayout)findViewById(R.id.camera_preview);

    glSurfaceView = new MyGLSurfaceView(this);

    renderer = glSurfaceView.getRenderer();

   // setContentView(glSurfaceView);

    surface.addView(glSurfaceView);

    Button captureButton = (Button) findViewById(R.id.button_capture);
    captureButton.setOnClickListener(
        new View.OnClickListener() {
            @SuppressWarnings("deprecation")
            @Override
            public void onClick(View v) {
                // get an image from the camera


         //       mCamera.takePicture(null, null, mPicture);

               // mCamera.setOneShotPreviewCallback(mPreviewCallback);

              takeSnapPhoto();


            }
        }
    );


}

@SuppressWarnings("deprecation")
public void startCamera(int texture)
{
    surface = new SurfaceTexture(texture);
    surface.setOnFrameAvailableListener(this);
    renderer.setSurface(surface);

    mCamera = Camera.open(CameraInfo.CAMERA_FACING_BACK);
    try
    {
        mCamera.setPreviewTexture(surface);


        mCamera.startPreview();
    }
    catch (IOException ioe)
    {
       Log.w("MainActivity","CAM LAUNCH FAILED");
    }
    Camera.Parameters param = mCamera.getParameters();
    param.setPictureSize(640, 480);
   // param.setColorEffect(Camera.Parameters.EFFECT_SEPIA);
    mCamera.setParameters(param);

}



public void onFrameAvailable(SurfaceTexture surfaceTexture)
{
    mFrameAvailable = true;
    glSurfaceView.requestRender();

}

@SuppressWarnings("deprecation")
@Override
public void onPause()
{
    mFrameAvailable = false;
    mCamera.stopPreview();
    mCamera.release();
    System.exit(0);
}



@SuppressWarnings("deprecation")
private PictureCallback mPicture = new PictureCallback() {

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {


     // Bitmap bitmap = BitmapFactory.decodeByteArray(data , 0, data .length);


        File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);




        if (pictureFile == null){
            Log.d("CrazyMirror", "Error creating media file, check storage permissions: ");
            return;
        }

        try {
            FileOutputStream fos = new FileOutputStream(pictureFile);
           // bitmap.compress(Bitmap.CompressFormat.PNG,100, fos);
            fos.write(data);
            fos.close();
        } catch (FileNotFoundException e) {
            Log.d("CrazyMirror", "File not found: " + e.getMessage());
        } catch (IOException e) {
            Log.d("CrazyMirror", "Error accessing file: " + e.getMessage());
        }

        refreshPreview();
    }

};


/** Create a File for saving an image or video */
@SuppressLint("SimpleDateFormat")
private static File getOutputMediaFile(int type){
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this.

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
              Environment.DIRECTORY_PICTURES), "CrazyMirror");
    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            Log.d("CrazyMirror", "failed to create directory");
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE){
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
        "IMG_"+ timeStamp + ".jpg");
    } 
    else if(type == MEDIA_TYPE_VIDEO) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
        "VID_"+ timeStamp + ".mp4");
    } 
    else {
        return null;
    }

    return mediaFile;
}

@SuppressWarnings("deprecation")
public void refreshPreview() {
    try {
        mCamera.stopPreview();
    } catch (Exception e) {}

    try {
        mCamera.startPreview();
    } catch (Exception e) {}
}

public void takeSnapPhoto() {
    mCamera.setOneShotPreviewCallback(new Camera.PreviewCallback() {
        @Override
        public void onPreviewFrame(byte[] data, Camera camera) {

            Camera.Parameters parameters = camera.getParameters();

            int format = parameters.getPreviewFormat();

            //YUV formats require more conversion
            if (format == ImageFormat.NV21 || format == ImageFormat.YUY2 || format == ImageFormat.NV16) {

                int w = parameters.getPreviewSize().width;

                int h = parameters.getPreviewSize().height;

                // Get the YuV image
                YuvImage yuv_image = new YuvImage(data, format, w, h, null);

                // Convert YuV to Jpeg
                Rect rect = new Rect(0, 0, w, h);

                ByteArrayOutputStream output_stream = new ByteArrayOutputStream();

                yuv_image.compressToJpeg(rect, 100, output_stream);

                byte[] byt = output_stream.toByteArray();

                FileOutputStream outStream = null;

                File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                        Environment.DIRECTORY_PICTURES), "CrazyMirror");

                String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());

                File mediaFile;

                mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                        "IMG_"+ timeStamp + ".jpg");


                try {
                    // Write to SD Card
                  //  File file = createFileInSDCard(FOLDER_PATH, "Image_"+System.currentTimeMillis()+".jpg");

                    //Uri uriSavedImage = Uri.fromFile(file);
                    outStream = new FileOutputStream(mediaFile);

                    outStream.write(byt);

                    outStream.close();

                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                }
            }
        }
    });}

}

0 个答案:

没有答案