以纵向保存照片

时间:2012-05-31 15:43:34

标签: android

我正在运行一个应用程序,该应用程序将始终以手机纵向运行。拍摄照片时,我可以在手机上看到纵向图像,但是当它保存到SD卡时,图像始终处于横向状态。这是我所做的,我用的就是清单

   <uses-feature android:name="android.hardware.screen.portrait" />

启动相机时,我使用以下内容更改方向

    camera = Camera.open(); // <8>
    Camera.Parameters parameters = camera.getParameters();
    camera.setDisplayOrientation(90);
    parameters.setZoom(16);
    parameters.setPictureFormat(PixelFormat.JPEG);
    camera.setParameters(parameters);

然后在保存照片时,我使用此代码

    PictureCallback jpegCallback = new PictureCallback() {
        public void onPictureTaken(byte[] data, Camera camera) { 
            FileOutputStream outStream = null;
            boolean mExternalStorageAvailable = false;
            boolean mExternalStorageWriteable = false;
            String state = Environment.getExternalStorageState();
            if (Environment.MEDIA_MOUNTED.equals(state)) {
                // We can read and write the media
                mExternalStorageAvailable = mExternalStorageWriteable = true;
                Log.d(TAG, "Can Write ");
                try {
                    String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
                    String fileName = "/" + System.currentTimeMillis() + ".jpg";
                    Log.d(TAG, "File: " + baseDir + fileName);
                    outStream = new FileOutputStream(baseDir + fileName); 
                    outStream.write(data);
                    outStream.close();

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

            } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
                // We can only read the media
                mExternalStorageAvailable = true;
                mExternalStorageWriteable = false;
                Log.d(TAG, "Cant Write ");
            } else {
                // Something else is wrong. It may be one of many other states, but all we need
                //  to know is we can neither read nor write
                mExternalStorageAvailable = mExternalStorageWriteable = false;
                Log.d(TAG, "Other Error ");
            }
                }
    };

1 个答案:

答案 0 :(得分:2)

我使用以下代码

完成了上述操作
   PictureCallback jpegCallback = new PictureCallback() {
    @Override
        public void onPictureTaken(byte[] data, Camera camera) { 
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 1;
        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;
        Bitmap bMap = BitmapFactory.decodeByteArray(data, 0, data.length, options);

        int orientation;
        // 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;
    boolean mExternalStorageAvailable = false;
    boolean mExternalStorageWriteable = false;
        try {
        String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath();
        String fileName = "/" + System.currentTimeMillis() + ".jpg";

            out = new FileOutputStream(baseDir + fileName);
            bMapRotate.compress(Bitmap.CompressFormat.JPEG, 50, out);
            if (bMapRotate != null) {
                bMapRotate.recycle();
                bMapRotate = null;
            }


        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
};