1

就像标题一样简单,使用 BitmapFactory.decodeFile 打开的文件在 ImageView 上显示时方向错误。从相机捕获的图像并保存在 tmp 文件中,因此如果设备存在返回 data.getData() null 的错误,我至少有对该文件的引用。

这只是启动相机活动并捕获图像文件

private void startCamera() {
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    if (hasImageCaptureBug()) {
        intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Constants.TMPFILE_PATH)));
    } else {
        intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    }
    startActivityForResult(intent, CAMERA_PIC_REQUEST);
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAMERA_PIC_REQUEST) {
        if (resultCode == RESULT_OK) {
            Uri uri = null;

            if (hasImageCaptureBug()) {
                File f = new File(Constants.TMPFILE_PATH);
                try {
                    uri = Uri.parse(android.provider.MediaStore.Images.Media.insertImage(getContentResolver(), f.getAbsolutePath(), null, null));
                } catch (FileNotFoundException e) {

                }
            } else {
                uri = data.getData();
            }

            imageFilePath = Image.getPath(this, uri);

            if (Image.exists(imageFilePath)) {
                ImageView image = (ImageView) findViewById(R.id.thumbnail);
                int targetW     = (int) getResources().getDimension(R.dimen.thumbnail_screen_width);
                int degrees     = (int) Image.getRotation(this, uri);

                Bitmap bmp = Image.resize(imageFilePath, targetW);
                bmp = Image.rotate(bmp, degrees);

                image.setAdjustViewBounds(true);
                image.setImageBitmap(bmp);
            }
        }
    }
}

这个文件调整图像大小

public class Image {
    public static Bitmap resize(String pathName, int targetW) {
        BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inJustDecodeBounds = true;

        Bitmap bmp = BitmapFactory.decodeFile(pathName, opts);

        int photoW = opts.outWidth;
        int photoH = opts.outHeight;
        int targetH = Math.round((photoH * targetW) / photoW);
        int scaleFactor = Math.min(photoW/targetW, photoH/targetH);

        opts.inJustDecodeBounds = false;
        opts.inSampleSize = scaleFactor;
        opts.inPurgeable = true;

        bmp = BitmapFactory.decodeFile(pathName, opts);

        return bmp;
    }
}

尝试获取 ExifOrientation 但始终为 0,因为文件本身的方向正确,就在我加载文件时,文件显示的方向错误。

问候

4

1 回答 1

0

似乎我预览图像的问题是Constants.TMPFILE_PATH,图像没有保存在那里,我只是使用这个修复显示在android中的图像视图布局中拍摄的最新图片,但如果我将它发布到问题仍然存在服务器......我会检查这个答案并为此打开一个新问题......


已编辑

要解决这个问题只需重构新图像然后将其上传到服务器,因为文件本身的原始数据有他的exif方向错误。

于 2012-08-17T22:01:50.640 回答