Android Camera Image Size
Asked Answered
G

3

14

In my app, I was able to run a code using the camera class to take pictures, but it gives me 2048 x 1536 pixels as the image size.

When I use the default camera of my android device, it gives me 2048 x 1232 pixels as the image size.

Now, the question is, how can I make my app to give me the same image size like the default camera (which is 2048 x 1232) when I take picture?

I have these codes:

CameraActivity.java

public class CameraActivity extends Activity {
    private static final String TAG = "CameraDemo";
    Preview preview; // <1>
    FrameLayout buttonClick; // <2>

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera);

        Toast.makeText(getBaseContext(), "Touch the screen to take picture.", Toast.LENGTH_SHORT).show();

        preview = new Preview(this); // <3>
        ((FrameLayout) findViewById(R.id.preview)).addView(preview); // <4>

        //buttonClick = (Button) findViewById(R.id.buttonClick);

        buttonClick = (FrameLayout) findViewById(R.id.preview);

        buttonClick.setOnClickListener(new OnClickListener() {
            public void onClick(View v) { // <5>
                preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback);
            }
        });

        Log.d(TAG, "onCreate'd");
    }

    // Called when shutter is opened
    ShutterCallback shutterCallback = new ShutterCallback() { // <6>
        public void onShutter() {
            Log.d(TAG, "onShutter'd");
        }
    };

    //Handles data for raw picture
    PictureCallback rawCallback = new PictureCallback() { // <7>
        public void onPictureTaken(byte[] data, Camera camera) {
            Log.d(TAG, "onPictureTaken - raw");
        }
    };


    // Handles data for jpeg picture
    PictureCallback jpegCallback = new PictureCallback() { // <8>
        public void onPictureTaken(byte[] data, Camera camera) {


            FileOutputStream outStream = null;
            try {

                //Write to SD Card
                outStream = new FileOutputStream(
                    String.format(
                            Environment.getExternalStorageDirectory() + "/Engagia/AudienceImages/" + CameraActivity.this.sessionNumber + ".jpg",
                            System.currentTimeMillis()
                    )); // <9>

                outStream.write(data);
                outStream.close();

                Toast.makeText(getBaseContext(), "Preview", Toast.LENGTH_SHORT).show();


                Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length);
            } catch (FileNotFoundException e) { // <10>
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {

            }
            Log.d(TAG, "onPictureTaken - jpeg");
        }
    };
}

Preview.java

package com.first.Engagia;

import java.io.IOException;

import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

class Preview extends SurfaceView implements SurfaceHolder.Callback { // <1>
    private static final String TAG = "Preview";

    SurfaceHolder mHolder;  // <2>
    public Camera camera; // <3>

    Preview(Context context) {
        super(context);

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();  // <4>
        mHolder.addCallback(this);  // <5>
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // <6>
    }


    //Called once the holder is ready
    public void surfaceCreated(SurfaceHolder holder) {  // <7>
        // The Surface has been created, acquire the camera and tell it where
        // to draw.
        camera = Camera.open(); // <8>
        try {
            camera.setPreviewDisplay(holder);  // <9>

            camera.setPreviewCallback(new PreviewCallback() { // <10>

                // Called for each frame previewed
                public void onPreviewFrame(byte[] data, Camera camera) {  // <11>
                    Log.d(TAG, "onPreviewFrame called at: " + System.currentTimeMillis());
                    Preview.this.invalidate();  // <12>
                }

            });
        } catch (IOException e) { // <13>
            e.printStackTrace();
        }
    }

  // Called when the holder is destroyed
  public void surfaceDestroyed(SurfaceHolder holder) {  // <14>
    camera.stopPreview();
    camera = null;
  }

  // Called when holder has changed
  public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // <15>
    camera.startPreview();
  }

}

Main.xml:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/preview" 
android:layout_width="match_parent"
android:layout_height="match_parent" >

<Button android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/buttonClick"
android:text="Click"
android:layout_gravity="right|bottom" />

</FrameLayout>
Glorify answered 20/7, 2011 at 4:5 Comment(0)
D
19

You can use setPictureSize() on the camera parameters object to configure the size of the capture:

http://developer.android.com/reference/android/hardware/Camera.Parameters.html#setPictureSize(int, int)

Generally speaking first you should call getSupportedPictureSizes() to make sure you're asking for a resolution that the hardware supports, but sounds like you already know the sizes.

Dispatcher answered 20/7, 2011 at 4:32 Comment(0)
Z
5

put this code

Parameters parameters = camera.getParameters();
parameters.set("jpeg-quality", 70);
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.setPictureSize(2048, 1232);
camera.setParameters(parameters);

in your surfaceCreated function after calling

camera = Camera.open();

you have found your solution...

Zacek answered 14/11, 2011 at 8:29 Comment(2)
You should only use picture sizes that are available from getSupportedPictureSizes(). Using anything else can crash the app. I have seen this first hand.Mcginnis
Bad idea hard-coding the picture size: If a phone does not support that picture size it's most likely going to crash. We dynamically set picture and preview size and even with that we still have cross-device issues.Monahan
J
0

en Click here

ch Click here

I have same problem in my work. I use that to solution my problem.

for example i use undercode in my SurfaceView(CameraPreview)

        Camera.Parameters parameters = camera.getParameters();
        pictureSize = MyCamPara.getInstance().getPictureSize(
                parameters.getSupportedPictureSizes(), 800);
        previewSize = MyCamPara.getInstance().getPreviewSize(
                parameters.getSupportedPreviewSizes(), getHeight());
        if (previewSize != null)
            parameters
                    .setPreviewSize(previewSize.width, previewSize.height);
        if (pictureSize != null)
            parameters
                    .setPictureSize(pictureSize.width, pictureSize.height);
        camera.setPreviewDisplay(holder);
        camera.setParameters(parameters);
        camera.startPreview();
Johannajohannah answered 17/12, 2014 at 9:39 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.