【问题标题】:How to rotate an image in android camera preview app before save it?如何在保存之前在 android 相机预览应用中旋转图像?
【发布时间】:2016-01-05 16:28:51
【问题描述】:

我有一个 Android 相机应用程序,它以纵向模式拍照,相机预览很好......但是当我拍照时它以横向模式保存......它旋转 90 度:我的代码 onPictureTaken():

PictureCallback jpegCallback = new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] arg0, Camera arg1) {

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss");
        String date = dateFormat.format(new Date());
        String photoFile = "Picture_" + date + ".jpg";

        String filename = pictureFileDir.getPath() + File.separator
                + photoFile;

        Log.e("path", filename.toString());

        File pictureFile = new File(filename);

        try {
            FileOutputStream fos = new FileOutputStream(pictureFile);
            fos.write(arg0);
            fos.close();

            Bitmap bm = BitmapFactory.decodeFile(filename);
            ByteArrayOutputStream bao = new ByteArrayOutputStream();
            bm.compress(Bitmap.CompressFormat.JPEG, 90, bao);
            byte[] ba = bao.toByteArray();
            // sba1 = Base64.encodeBytes(ba);
            int flag = 0; // you can pass the default 0 = Base64.DEFAULT
            String ba1 = Base64.encodeToString(ba, flag);

            // Log.e("base64", "-----" + ba1);

            Toast.makeText(AndroidCamera.this,
                    "New Image saved 22222:" + photoFile, Toast.LENGTH_LONG)
                    .show();
            Intent intent = new Intent(AndroidCamera.this,
                    UploadActivity.class);

            fileUri = Uri.fromFile(pictureFile);

            intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

            // start the image capture Intent
            startActivityForResult(intent,
                    CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
            launchUploadActivity(true);

        } catch (Exception error) {
            // Log.d(MakePhotoActivity.DEBUG_TAG, "File" + filename +
            // "not saved: "
            // + error.getMessage());
            Toast.makeText(AndroidCamera.this, "Image could not be saved.",
                    Toast.LENGTH_LONG).show();
        }
    }
};

【问题讨论】:

    标签: android android-camera


    【解决方案1】:

    您可以像这样将位图旋转 90 度:

    Matrix matrix = new Matrix();
    matrix.postRotate(90);
    Bitmap rotatedBitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
    

    在您的具体示例中,您需要将其保存回原始路径:

    Bitmap bm = BitmapFactory.decodeFile(filename);
    
    Matrix matrix = new Matrix();
    matrix.postRotate(90);    
    Bitmap rotatedBitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
    
    FileOutputStream fos = new FileOutputStream(pictureFile);
    rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
    fos.close();
    

    你也可以使用Camera.Parameters.setRotation()

    【讨论】:

    • 在什么情况下它不起作用?它是否抛出异常?还是只是不旋转?您是否将 compress() 调用更改为 rotateBitmap.compress(Bitmap.CompressFormat.JPEG, 90, bao); ?
    • 是的,我调用了 rotateBitmap.compress(Bitmap.CompressFormat.JPEG, 90, bao); ..但它只是没有旋转!
    • 好吧,您的代码正在将位图写入 base64 字符串,我认为这就是您想要的。请参阅编辑以回答如何保存旋转的 JPEG 文件。
    • 我尝试了这个,但它抛出了一个异常
    • 01-07 02:56:37.736:E/BitmapFactory(17914):无法解码流:java.io.FileNotFoundException:/storage/emulated/0/DCIM/Camera/Picture_20155607025637.jpg:打开失败:ENOENT(没有这样的文件或目录)..
    猜你喜欢
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2013-10-05
    • 2013-01-26
    • 1970-01-01
    相关资源
    最近更新 更多