私のアプリでは、カメラクラスを使用してコードを実行して写真を撮ることができましたが、画像サイズとして2048 x1536ピクセルが得られます。
Androidデバイスのデフォルトのカメラを使用すると、画像サイズとして2048 x1232ピクセルが表示されます。
さて、問題は、写真を撮るときにデフォルトのカメラ(2048 x 1232)と同じ画像サイズをアプリに与えるにはどうすればよいですか?
私はこれらのコードを持っています:
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>
カメラパラメータオブジェクトでsetPictureSize()を使用して、キャプチャのサイズを設定できます。
http://developer.Android.com/reference/Android/hardware/Camera.Parameters.html#setPictureSize(int 、int)
一般的に言えば、最初にgetSupportedPictureSizes()を呼び出して、ハードウェアがサポートする解像度を要求していることを確認する必要がありますが、サイズはすでにわかっているようです。
このコードを入れて
Parameters parameters = camera.getParameters();
parameters.set("jpeg-quality", 70);
parameters.setPictureFormat(PixelFormat.JPEG);
parameters.setPictureSize(2048, 1232);
camera.setParameters(parameters);
呼び出した後、surfaceCreated関数で
camera = Camera.open();
あなたはあなたの解決策を見つけました...
jaクリック ここ
chクリック ここ
私の仕事にも同じ問題があります。私はそれを使って問題を解決します。
たとえば、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();