来自自定义相机的图像被从预览中裁剪掉

我正在为我的应用设置自定义相机,但是我面临的问题是在保存时图像从顶部和底部被裁剪。我确实设置了图片大小,但仍然面临问题。该应用程序只能在纵向模式下运行。

这是我的布局文件:

<?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);
    }


}
laozi8huai 回答:来自自定义相机的图像被从预览中裁剪掉

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3124265.html

大家都在问