17

私は、カメラを使用して写真を撮る Android のアプリケーションで作業しています。カメラを起動するには、次のintent ACTION_IMAGE_CAPTUREように使用しています。

Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File image=new File(Environment.getExternalStorageDirectory(),"PhotoContest.jpg");
        camera.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(image));
        imageUri=Uri.fromFile(image);
        startActivityForResult(camera,1);

public void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode){
       case 1:
            if (resultCode == Activity.RESULT_OK) {
                  selectedImage = imageUri;
                  getContentResolver().notifyChange(selectedImage, null);
                  image= (ImageView) findViewById(R.id.imageview);
                  ContentResolver cr = getContentResolver();
                  Bitmap bitmap;
                  try {
                       bitmap = android.provider.MediaStore.Images.Media
                       .getBitmap(cr, selectedImage);
                       image.setImageBitmap(bitmap);
                       Toast.makeText(this, selectedImage.toString(),
                              Toast.LENGTH_LONG).show();
                  } catch (Exception e) {
                      Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT)
                              .show();
                      Log.e("Camera", e.toString());
                  }
                 }
             else 

         if(resultCode == Activity.RESULT_CANCELED) {
                    Toast.makeText(EditPhoto.this, "Picture could not be taken.", Toast.LENGTH_SHORT).show();
                }
       }
}

問題は、撮影されたすべての写真が 90 度回転して水平になることです。

これもマニフェストファイルに入れました:

 <activity android:name=".EditPhoto">
    android:screenOrientation="portrait"
    </activity>

しかし、まだ結果はありません!誰でも私を助けることができますか?

4

2 に答える 2

32

http://developer.android.com/reference/android/media/ExifInterface.html

http://developer.android.com/reference/android/media/ExifInterface.html#TAG_ORIENTATION

だから

Activity.onActivityResult(data, request, result) {
 if (request == PHOTO_REQUEST && result == RESULT_OK) {
   ...
   Uri imageUri = ...
   File imageFile = new File(imageUri.toString());
   ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath());
   int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
   int rotate = 0;
   switch(orientation) {
     case ExifInterface.ORIENTATION_ROTATE_270:
         rotate-=90;
     case ExifInterface.ORIENTATION_ROTATE_180:
         rotate-=90;
     case ExifInterface.ORIENTATION_ROTATE_90:
         rotate-=90;
   }
   Canvas canvas = new Canvas(bitmap);
   canvas.rotate(rotate);
 }

これはまったく役に立ちますか?


グレッグの素晴らしい答えに追加するために、ここに仕事をするための全体の「カテゴリー」があります:

public static int neededRotation(File ff)
        {
        try
            {

            ExifInterface exif = new ExifInterface(ff.getAbsolutePath());
            int orientation = exif.getAttributeInt(
               ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

            if (orientation == ExifInterface.ORIENTATION_ROTATE_270)
                { return 270; }
            if (orientation == ExifInterface.ORIENTATION_ROTATE_180)
                { return 180; }
            if (orientation == ExifInterface.ORIENTATION_ROTATE_90)
                { return 90; }
            return 0;

            } catch (FileNotFoundException e)
            {
            e.printStackTrace();
            } catch (IOException e)
            {
            e.printStackTrace();
            }
        return 0;
        }

あなたは多かれ少なかれこのようにそれを使うでしょう...

public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
    if (requestCode == REQUEST_IMAGE_CAPTURE) // && resultCode == RESULT_OK )
        {
        try
            {
            Bitmap cameraBmp = MediaStore.Images.Media.getBitmap(
                    State.mainActivity.getContentResolver(),
                    Uri.fromFile( Utils.tempFileForAnImage() )  );

            cameraBmp = ThumbnailUtils.extractThumbnail(cameraBmp, 320,320);
            // NOTE incredibly useful trick for cropping/resizing square
            // http://stackoverflow.com/a/17733530/294884

            Matrix m = new Matrix();
            m.postRotate( Utils.neededRotation(Utils.tempFileForAnImage()) );

            cameraBmp = Bitmap.createBitmap(cameraBmp,
                    0, 0, cameraBmp.getWidth(), cameraBmp.getHeight(),
                    m, true);

            yourImageView.setImageBitmap(cameraBmp);

            // to convert to bytes...
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            cameraBmp.compress(Bitmap.CompressFormat.JPEG, 75, baos);
            //or say cameraBmp.compress(Bitmap.CompressFormat.PNG, 0, baos);
            imageBytesRESULT = baos.toByteArray();

            } catch (FileNotFoundException e)
            {
            e.printStackTrace();
            } catch (IOException e)
            {
            e.printStackTrace();
            }

        return;
        }

    }

将来、誰かがタイピングする手間が省けることを願っています。

于 2011-09-14T05:52:36.290 に答える