1

画像プレビューを作成していて、非常に高い画像解像度を得たいと思っていました。ただし、理由はわかりませんが、Galaxy Nexus は幅広い解像度をサポートしているにもかかわらず (最大のものは 1920x1080 だと思いますが、それらが正確な値かどうかは思い出せません)、画像を保存すると、プレビューからの情報は 320x240 です。

pixels.mCamera = getCameraInstance();
Camera.Parameters params = mCamera.getParameters();
List<Size> sizes = params.getSupportedPreviewSizes();
Size biggestSize = sizes.get(0);
double biggestPixels = biggestSize.width + biggestSize.height;
for (Size size : sizes) {
    double pixels = size.width * size.height;
    if (pixels > biggestPixels) {
        biggestSize = size;
        biggestPixels = pixels;
    }
}
// At this point, biggestSize is 1920x1080
float ratio = ((float) biggestSize.width)
                    / ((float) biggestSize.height);
params.setPreviewSize(biggestSize.width, biggestSize.height);
mCamera.setParameters(params);
setCameraDisplayOrientation(this, 0, mCamera);
mPreview = new CameraPreview(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
LinearLayout innerWrapper = (LinearLayout) findViewById(R.id.innerWrapper);
LayoutParams layoutParams = (LayoutParams) innerWrapper
                    .getLayoutParams();
layoutParams.height = (int) (layoutParams.height * ratio);
innerWrapper.setLayoutParams(layoutParams);
preview.addView(mPreview);

それinnerWrapperは正方形の絵を見せることです。setCameraOrientation比率に合わせて画像を回転させます。写真を撮るときはオートフォーカスを使います。

mCamera.autoFocus(new AutoFocusCallback() {

    @Override
    public void onAutoFocus(boolean success, Camera camera) {
        mCamera.takePicture(null, null, new PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 1;
                Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
                                            data.length, options);
                Bitmap finalBitmap;
                float ow = bitmap.getWidth();
                float oh = bitmap.getHeight();
                // At this point, ow and oh are 320 and 240
                float ratio = ow / oh;
                int fw, fh, x, y, angle;
                //It continues, but irrelevant
                ...

FrameLayoutこれは、プレビューを保持するために使用するレイアウトのサイズに関連していますか? 350x350 dp と定義したため、プレビューは大きくなるはずです。

4

1 に答える 1

1

愚かな私。問題は、 myがパラメーターではなくパラメーターPictureCallbackとして実装されていることです。どこで、ドキュメントを引用します:jpegraw

raw コールバックは、raw 画像データが利用可能な場合に発生します (注: 利用可能な raw 画像コールバック バッファがない場合、または raw 画像コールバック バッファが raw 画像を保持するのに十分な大きさでない場合、データは null になります)。ポストビュー コールバックは、スケーリングされ、完全に処理されたポストビュー イメージが利用可能な場合に発生します (注: すべてのハードウェアがこれをサポートしているわけではありません)。jpeg コールバックは、圧縮された画像が利用可能になると発生します。

全体PictureCallbackを 3 番目のパラメーターではmCamera.takePictureなく 2 番目のパラメーターに移動すると、問題を解決することができます。ただし、そうする必要があり、CallbackBufferバッファの使用に適応するようにコードを変更する必要があります。最初のバージョンでは、低品質の写真に固執します。

于 2013-03-20T11:55:50.440 に答える