使用Android拍照出现问题(竖屏相机| 竖直方向)

4
以下代码显示摄像机的垂直预览,它可以正常工作。但是!我得到了一张横向的照片!:(
我该如何让它垂直显示呢?我已经将预览视图设置为垂直方向,但是我无法垂直保存图片。
问候和感谢, Fran
单击
public void onClick(View arg0) {
       camera.takePicture(myShutterCallback, myPictureCallback_RAW, myPictureCallback_JPG);
}

预览

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    if (previewing) {
        camera.stopPreview();
        previewing = false;
    }
    if (camera != null) {
        /*
         * camera.setPreviewDisplay(surfaceHolder); camera.startPreview();
         * previewing = true;
         */
        Camera.Parameters parameters = camera.getParameters();
        parameters.setPreviewSize(width, height);
        camera.setParameters(parameters);

        // Condicions per utilitzar la orientacio adecuada segons el sdk
        if (Integer.parseInt(Build.VERSION.SDK) >= 8)
            setDisplayOrientation(camera, 90);
        else {
            if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
                parameters.set("orientation", "portrait");
                parameters.set("rotation", 90);
            }
            if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
                parameters.set("orientation", "landscape");
                parameters.set("rotation", 90);
            }
            camera.setParameters(parameters);
        }

        // camera.startPreview();
        previewing = true;
    }
}

拍照

PictureCallback myPictureCallback_JPG = new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] arg0, Camera arg1) {
        // intentar canvia horientacio
        Bitmap bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0, arg0.length);
        //bitmapPicture.

        OutputStream imageFileOS;
        try {
            imageFileOS = new FileOutputStream(String.format("/sdcard/DCIM/iboo/captura.jpg"));
            imageFileOS.write(arg0);
            imageFileOS.flush();
            imageFileOS.close();
            // Missatge en cas de capturar l'imatge correctament
            Toast.makeText(Principal.this, "Imatge Capturada!",
                    Toast.LENGTH_LONG).show();
            MostrarFoto("/sdcard/DCIM/iboo/captura.jpg");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // camera.startPreview();


                }
};
4个回答

7

这是我实施的解决方案,它工作得非常完美。希望可以帮到你。

PictureCallback myPictureCallback_JPG = new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] arg0, Camera arg1) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 6;
        options.inDither = false; // Disable Dithering mode
        options.inPurgeable = true; // Tell to gc that whether it needs free
                                    // memory, the Bitmap can be cleared
        options.inInputShareable = true; // Which kind of reference will be
                                            // used to recover the Bitmap
                                            // data after being clear, when
                                            // it will be used in the future
        options.inTempStorage = new byte[32 * 1024];
        options.inPreferredConfig = Bitmap.Config.RGB_565;
        bMap = BitmapFactory.decodeByteArray(arg0, 0, arg0.length, options);

        // others devices
        if(bMap.getHeight() < bMap.getWidth()){
            orientation = 90;
        } else {
            orientation = 0;
        }

        Bitmap bMapRotate;
        if (orientation != 0) {
            Matrix matrix = new Matrix();
            matrix.postRotate(orientation);
            bMapRotate = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(),
                    bMap.getHeight(), matrix, true);
        } else
            bMapRotate = Bitmap.createScaledBitmap(bMap, bMap.getWidth(),
                    bMap.getHeight(), true);


        FileOutputStream out;
        try {
            out = new FileOutputStream(
                    String.format("/sdcard/DCIM/test/screen.jpg"));
            bMapRotate.compress(Bitmap.CompressFormat.JPEG, 90, out);
            if (bMapRotate != null) {
                bMapRotate.recycle();
                bMapRotate = null;
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        camera.startPreview();
        MostrarFoto(imageInSD);
        editor = prefs.edit();
        editor.putString("PathSeleccio", imageInSD);
        editor.commit();
    }
};

我不知道你从哪里获取bMap变量,而且orientation变量似乎没有被声明。 - jimbob

1
Camera.Parameters param;
param = camera.getParameters();

Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
if(display.getRotation() == Surface.ROTATION_0)
{
    camera.setDisplayOrientation(90);
    param.setRotation(90);
}
if(display.getRotation() == Surface.ROTATION_270)
{
    camera.setDisplayOrientation(180);
    param.setRotation(180);
}

camera.setParameters(param);
camera.takePicture(shutterCallback, rawCallback, jpegCallback);

0

设置图像方向,请使用以下代码:

Matrix mat = new Matrix();
mat.postRotate(90);
image_to_upload = Bitmap.createBitmap(myImage, 0, 0, myImage.getWidth(), myImage.getHeight(), mat, true);

0

实际上你不需要旋转位图。这会占用内存/变慢等,看起来在你的情况下(拍摄后立即保存到文件)更好的做法是更新 JPEG 文件中的 Exif 标签,例如:

    int degrees = 90;
    ExifInterface exif = new ExifInterface(path);
    exif.setAttribute(ExifInterface.TAG_ORIENTATION, String.valueOf(degrees));
    exif.saveAttributes();

对我来说没用。我传递了这个路径,但图像仍然是横向模式,/storage/sdcard0/Pictures/Hijab2Go/IMG_20140318_114648.jpg。 - Hesam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接