【问题标题】:code to rotate image captured by camera intent not working in Android旋转相机意图捕获的图像的代码在Android中不起作用
【发布时间】:2012-12-16 22:10:34
【问题描述】:

我遇到了一个问题,即我使用相机意图拍摄的图像被旋转了,我在 Why does an image captured using camera intent gets rotated on some devices on Android? 提出了这个问题

因此,根据那里的建议答案,我现在正在尝试旋转使用相机获得的图像(我使用了相机意图)。我的代码是,

public class SimpleCameraActivity extends Activity {
private static final int TAKE_PICTURE = 1888;
private Uri imageUri;
ImageView imageView;
Bitmap bitmap;
Button btnOK, btnDiscard;
RelativeLayout rLButtons;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.simple_camera);
    imageView = (ImageView) findViewById(R.id.image_view_sc);
    captureImage();
}

public void captureImage() {
    Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE");
    File filePhoto = new File(Environment.getExternalStorageDirectory(), "Pic.jpg");
    imageUri = Uri.fromFile(filePhoto);
    MyApplicationGlobal.imageUri = imageUri.getPath();
    intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    startActivityForResult(intentCamera, TAKE_PICTURE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intentFromCamera) {
    super.onActivityResult(requestCode, resultCode, intentFromCamera);
    if (resultCode == RESULT_OK && requestCode == TAKE_PICTURE) {
        if (intentFromCamera != null) {
            Bundle extras = intentFromCamera.getExtras();
            if (extras.containsKey("data")) {
                bitmap = (Bitmap) extras.get("data");
            } else {
                bitmap = getBitmapFromUri();
            }
        } else {
            bitmap = getBitmapFromUri();
        }
        checkForRotation();
        //rotateImage();
        //rotateImage1();
        rotateImage3();
        //imageView.setImageBitmap(bitmap);
        // imageView.setImageURI(imageUri);
    } else {
        finish();
    }
}

public void rotateImage() {
    Bitmap targetBitmap = Bitmap.createBitmap(100, 80, bitmap.getConfig());
    Canvas canvas = new Canvas(targetBitmap);
    Matrix matrix = new Matrix();
    matrix.setRotate(180, bitmap.getWidth() / 2, bitmap.getHeight() / 2);
    matrix.setRotate(90);
    canvas.drawBitmap(bitmap, matrix, new Paint());
    imageView.setImageBitmap(bitmap);
}

public void rotateImage1() {
    Matrix matrix = new Matrix();
    matrix.setRotate(90, bitmap.getWidth() / 2, bitmap.getHeight() / 2);
    RectF rectF = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());
    matrix.mapRect(rectF);
    Bitmap targetBitmap = Bitmap.createBitmap((int) rectF.width(), (int) rectF.height(), bitmap.getConfig());
    Canvas canvas = new Canvas(targetBitmap);
    canvas.drawBitmap(bitmap, matrix, new Paint());
    imageView.setImageBitmap(bitmap);
}

public void rotateImage2() {
    Matrix mtx = new Matrix();
    mtx.reset();
    mtx.preTranslate(20, 30);
    mtx.setRotate((float) 90, 25, 35);
    mtx.postTranslate(30, 40);
    Bitmap rotatedBMP = Bitmap.createBitmap(bitmap, 0, 0, 100, 100, mtx, true);
    this.bitmap = rotatedBMP;
    imageView.setImageBitmap(bitmap);
}

public void rotateImage3() {
    Bitmap bmpOriginal = bitmap;
    Bitmap targetBitmap = Bitmap.createBitmap((bmpOriginal.getWidth()), (bmpOriginal.getHeight()), Bitmap.Config.ARGB_8888);
    Paint p = new Paint();
    p.setAntiAlias(true);

    Matrix matrix = new Matrix();
    matrix.setRotate((float) 90, (float) (bmpOriginal.getWidth() / 2), (float) (bmpOriginal.getHeight() / 2));

    RectF rectF = new RectF(0, 0, bmpOriginal.getWidth(), bmpOriginal.getHeight());
    matrix.mapRect(rectF);

    targetBitmap = Bitmap.createBitmap((int) rectF.width(), (int) rectF.height(), Bitmap.Config.ALPHA_8);

    Canvas tempCanvas = new Canvas(targetBitmap);
    tempCanvas.drawBitmap(bmpOriginal, matrix, p);
    imageView.setImageBitmap(bmpOriginal);
}

public Bitmap getBitmapFromUri() {
    getContentResolver().notifyChange(imageUri, null);
    ContentResolver cr = getContentResolver();
    Bitmap bitmap;
    try {
        bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, imageUri);
        return bitmap;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}
}

我尝试了不同的代码 rotateImage、1、2、3 等。但没有代码有效。 rotateImage2() 工作正常,但严重影响质量,所以不能使用。

我从Android: How to rotate a bitmap on a center point 获得了这些代码,用户说它可以工作,但不适用于我。 那我做错了什么。

【问题讨论】:

    标签: android image rotation image-rotation android-camera-intent


    【解决方案1】:

    坚持使用 rotateImage2() 并使用更少的转换。这段代码对我有用:

    private Bitmap rotateImage(String pathToImage) {
    
        // 1. figure out the amount of degrees
        int rotation = getImageRotation();
    
        // 2. rotate matrix by postconcatination
        Matrix matrix = new Matrix();
        matrix.postRotate(rotation);
    
        // 3. create Bitmap from rotated matrix
        Bitmap sourceBitmap = BitmapFactory.decodeFile(pathToImage);
        return Bitmap.createBitmap(sourceBitmap, 0, 0, sourceBitmap.getWidth(), sourceBitmap.getHeight(), matrix, true);        
    }
    

    获取图像旋转check out your other post。有关矩阵运算及其差异的更多信息,例如 setRotate 和 postRotate check out this post

    【讨论】:

    • BitmapFactory.decodeFile("my image path")(here imageUri) 总是返回 null,但好消息是代码正在旋转图像(位图)
    • 很高兴它也对您有用。如果“decodeFile”返回null,你的路径可能有问题:指定的文件名是null,或者无法解码为位图...
    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    相关资源
    最近更新 更多