我正在为我的应用设置自定义相机,但是我面临的问题是在保存时图像从顶部和底部被裁剪。我确实设置了图片大小,但仍然面临问题。该应用程序只能在纵向模式下运行。
这是我的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:configChanges="orientation"
android:screenOrientation="portrait"
android:orientation="vertical">
<LinearLayout
android:id="@+id/picContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0.1" />
<LinearLayout
android:id="@+id/picBtnContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<Button
android:id="@+id/captureBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="captureImage"
android:text="Capture"
android:textSize="10sp" />
</LinearLayout>
</RelativeLayout>
这是自定义相机类:
package com.example.cameratest;
import android.content.Context;
import android.content.res.Configuration;
import android.view.SurfaceView;
import android.view.SurfaceHolder;
import android.hardware.Camera;
import java.io.IOException;
import java.util.List;
import java.util.Objects;
public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback {
Camera camera;
SurfaceHolder holder;
Camera.Parameters params ;
public ShowCamera(Context context,Camera camera) {
super(context);
this.camera = camera;
holder = getHolder();
holder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
params = camera.getParameters();
List<Camera.Size> sizes = params.getSupportedPictureSizes();
Camera.Size mSize = null;
for (Camera.Size size: sizes){
if(mSize==null){
mSize = size;
} else if (mSize.width*mSize.height<size.width*size.height){
mSize = size;
}
}
//change the rrientation of thecamera
if(this.getResources().getconfiguration().orientation!= Configuration.ORIENTATION_LANDSCAPE){
params.set("orientation","portrait");
camera.setDisplayOrientation(90);
params.setRotation(90);
} else {
params.set("orientation","portrait");
camera.setDisplayOrientation(90);
params.setRotation(90);
}
params.setPictureSize(mSize.width,mSize.height);
params.setfocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
camera.setParameters(params);
try{
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch(IOException e){
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder,int i,int i1,int i2) {
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
camera.stopPreview();
camera.release();
}
}
这是activity类
package com.example.cameratest;
import androidx.appcompat.app.AppCompatactivity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.DisplayMetrics;
import android.util.SparseArray;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
public class PancardView extends AppCompatactivity {
Camera camera;
LinearLayout picContainer;
ShowCamera showCamera;
TextRecognizer textRecognizer;
TextView panTxt;
File picture_file;
File folder_gui = new File(Environment.getExternalStorageDirectory()+File.separator+"finzaa");
File outputFile = new File(folder_gui,"temp.jpg");
int pw,ph;
int camx,camy;
Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
@Override
public void onPicturetaken(byte[] bytes,Camera camera) {
picture_file = getOutputMediaFile();
if (picture_file==null){
return;
} else {
try{
FileOutputStream fos = new FileOutputStream(picture_file);
fos.write(bytes);
fos.close();
//System.out.println(outputFile);
galleryAddPic(String.valueOf(outputFile));
camera.startPreview();
} catch(IOException e){
e.printStackTrace();
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pancard_view);
final LinearLayout picContainer = findViewById(R.id.picContainer);
camera = Camera.open();
showCamera = new ShowCamera(this,camera);
picContainer.addView(showCamera);
picContainer.post(new Runnable(){
public void run(){
pw = picContainer.getWidth();
ph = picContainer.getHeight();
}
});
}
public void captureImage(View v){
if(camera!=null){
camera.takePicture(null,null,mPictureCallback);
}
}
private File getOutputMediaFile(){
String state = Environment.getExternalStorageState();
if(!state.equals(Environment.MEDIA_MOUNTED)){
return null;
} else {
while(!folder_gui.exists()){
folder_gui.mkdirs();
}
return outputFile;
}
}
private void galleryAddPic(String mCurrentPhotoPath) {
Intent mediaScanIntent = new Intent(Intent.actION_MEDIA_SCANNER_SCAN_FILE);
File f = new File(mCurrentPhotoPath);
System.out.println("filesize"+f.getTotalSpace());
Uri contenturi = Uri.fromFile(f);
mediaScanIntent.setData(contenturi);
this.sendBroadcast(mediaScanIntent);
}
}