从android摄像头屏幕裁剪图像

从android摄像头屏幕裁剪图像,android,crop,Android,Crop,我想开发一个摄像头屏幕,它由一个带边框的摄像头组成(参见第一张图片)。当我拍摄照片时,我不需要完整的图像,我只需要帧内图像的一部分(参见第二张图像) 我在github中尝试了许多图像裁剪库 我也试着打电话给crop Intent cropIntent = new Intent("com.android.camera.action.CROP"); cropIntent.setDataAndType(uri, "image/*"); cropIn

我想开发一个摄像头屏幕,它由一个带边框的摄像头组成(参见第一张图片)。当我拍摄照片时,我不需要完整的图像,我只需要帧内图像的一部分(参见第二张图像)

我在github中尝试了许多图像裁剪库

我也试着打电话给crop

        Intent cropIntent = new Intent("com.android.camera.action.CROP");
        cropIntent.setDataAndType(uri, "image/*");
        cropIntent.putExtra("crop", "true");
        cropIntent.putExtra("scale", true);
        cropIntent.putExtra("return-data", true);
        startActivityForResult(cropIntent, CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE);

这些并不能帮助我在框架内裁剪图像。我不想要单独的裁剪屏幕。请帮帮我。提前谢谢。

这个库应该可以做到这一点 我一直在用它。它起作用了

它允许你从图库或相机中拍摄照片,并支持裁剪,你不需要编写太多的代码就能让它工作
;-)

您可以使用surface创建自定义相机,并尝试此操作,希望结果符合您的要求

 public class MainActivity extends Activity implements SurfaceHolder.Callback {

Camera mCamera;
SurfaceView mPreview; 

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mPreview = (SurfaceView)findViewById(R.id.preview);
    mPreview.getHolder().addCallback(this);
    mPreview.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    mCamera = Camera.open();
}   
@Override
public void onPause() {
    super.onPause();
    mCamera.stopPreview();
}    
@Override
public void onDestroy() {
    super.onDestroy();
    mCamera.release();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {       
    Parameters parameters = mCamera.getParameters();
    List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
    Camera.Size previewSize = previewSizes.get(4); //480h x 720w

    parameters.setPreviewSize(previewSize.width, previewSize.height);
    parameters.setFlashMode(Parameters.FLASH_MODE_AUTO);
    parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

    mCamera.setParameters(parameters);

    Display display = ((WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    if(display.getRotation() == Surface.ROTATION_0) {                        
        mCamera.setDisplayOrientation(90);
    } else if(display.getRotation() == Surface.ROTATION_270) {
        mCamera.setDisplayOrientation(180);
    }

    mCamera.startPreview();
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
    try {
        mCamera.setPreviewDisplay(mPreview.getHolder());
    } catch (Exception e) {
        e.printStackTrace();
    }
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    Log.i("PREVIEW","surfaceDestroyed");
}
}
响应高于代码

很好。试试这个

    int[] location = new int[2];
    iv_frame.getLocationOnScreen(location);
    int x = location[0];
    int y = location[1];

    Bitmap croppedBitmap = Bitmap.createBitmap(bitmap, x, y, iv_frame.getMeasuredWidth() + 160, iv_frame.getMeasuredHeight() + 160); // Adjust the 160 according to your need. In my case the frame has a fixed length and width

拍照->使用相机结果数据调用此函数->保存生成的位图:)

该帧是另一个图像吗?为什么不使用camera 2 API创建一个活动,使用可绘制边框XML文件创建一个覆盖,然后在拍摄后根据该边框裁剪图像?是的。框架是摄影机布局上方的另一个图像@SanthosHjosephy您可以发送任何参考链接@emandtAny解决方案吗?我有一些问题,请清楚地理解我的问题。我不需要单独的裁剪功能。我需要的框架内的图像应该被裁剪,而采取的照片。哦,好的。非常抱歉。让我回到你身边谢谢你的帮助。你试过这个代码吗?它不起作用,您将FrameLayout和SurfaceView id都命名为Preview我正在使用它,错误地添加了它check now我删除了它edit frame as you want第90行的异常:尝试调用虚拟方法“android.view.SurfaceHolder android.view.SurfaceView.getHolder()'在发布回答之前,请运行您的代码一次是的,有权限,我正在检查,请尝试。我可以在这方面给你更多的帮助。它正在裁剪图像,但在框架内并没有正确裁剪。实际上,我的框架是线性布局的,调整代码中提到的“160”。希望能有帮助。由于已经开始种植,现在我们需要注意测量。
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA" />
    int[] location = new int[2];
    iv_frame.getLocationOnScreen(location);
    int x = location[0];
    int y = location[1];

    Bitmap croppedBitmap = Bitmap.createBitmap(bitmap, x, y, iv_frame.getMeasuredWidth() + 160, iv_frame.getMeasuredHeight() + 160); // Adjust the 160 according to your need. In my case the frame has a fixed length and width