我想开发一个摄像头屏幕,该摄像头屏幕由带框架的摄像头组成(请参见第一个图像)。拍摄照片时,我不需要完整的图像,只需要框架中存在的图像部分即可(请参见第二个图像)。
我在github中尝试了许多图像裁剪库。
https://github.com/Yalantis/uCrop
https://github.com/ArthurHub/Android-Image-Cropper
我还试图打电话给作物
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);
这些并不能帮助我裁剪框架内的图像。我不想单独裁剪屏幕。请帮帮我。预先感谢。
答案 0 :(得分:1)
您可以使用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");
}
}
您的xml看起来像
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<SurfaceView
android:id="@+id/preview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</FrameLayout>
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="400px"
android:layout_marginTop="300px"
android:layout_marginStart="70px"
android:layout_marginEnd="70px"
android:background="@drawable/border" />
<RelativeLayout
android:id="@+id/rel_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<!---Customize your views and button-->
</RelativeLayout>
</FrameLayout>
和您的manifests.xml
,如果您使用的是Android 5.1以上版本,请添加运行时权限,也可以通过从应用设置中手动授予权限进行检查
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA" />
响应是上面的代码
答案 1 :(得分:1)
好吧。试试这个。
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
拍照->用相机结果数据调用此功能->保存结果位图:)
答案 2 :(得分:-1)
这个库应该可以解决问题 我用它所有的时间 。有效
https://android-arsenal.com/details/1/4760
它使您可以在带有作物支持的画廊或相机中拍照,而无需编写太多代码即可开始工作 ;-)