2014-06-10 8 views
0

나는이 코드를 사용하며 MediaStore은 (는) 작은 크기의 bitmapimage을 돌려줍니다.MediaStore에서 정상 크기로 변환

mediastore 사진의 정상적인 크기를 얻는 방법?

누군가가 문제를 해결할 수 있도록 도와주세요. 이 문제를 해결하려면 도움이 필요합니다. 보통 크기의 사진이 필요합니다.

public class ActivityPhoto extends Activity implements OnClickListener{ 

    File directory; 
    final int TYPE_PHOTO = 1; 
    final int REQUEST_CODE_PHOTO = 1; 

    ImageView imageViewPhoto; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.schedule_of_subject_photo); 

     createDirectory(); 
     imageViewPhoto = (ImageView) findViewById(R.id.imageViewPhoto); 
    } 

    public void onClickPhoto(View view) { 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

     intent.putExtra(MediaStore.EXTRA_OUTPUT, generateFileUri(TYPE_PHOTO)); 
     startActivityForResult(intent, REQUEST_CODE_PHOTO); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, 
      Intent intent) { 
     if (requestCode == REQUEST_CODE_PHOTO) { 
      if (resultCode == RESULT_OK) { 
       if (intent == null) { 
        Log.d(TAG, "Intent is null"); 
       } else { 
        Log.d(TAG, "Photo uri: " + intent.getData()); 
        Bundle bndl = intent.getExtras(); 
        if (bndl != null) { 
         Object obj = intent.getExtras().get("data"); 
         if (obj instanceof Bitmap) { 
          Bitmap bitmap = (Bitmap) obj; 
          Log.d(TAG, "bitmap " + bitmap.getWidth() + " x " + bitmap.getHeight()); 
          imageViewPhoto.setImageBitmap(bitmap); 
         } 
        } 
       } 
      } else if (resultCode == RESULT_CANCELED) { 
       Log.d(TAG, "Canceled"); 
      } 
     } 
    } 

    private Uri generateFileUri(int type) { 
     File file = null; 
     switch (type) { 
     case TYPE_PHOTO: 
      file = new File(directory.getPath() + "/" + "photo_" 
        + System.currentTimeMillis() + ".jpg"); 
      break; 
     } 
     Log.d(TAG, "fileName = " + file); 
     return Uri.fromFile(file); 
    } 

    private void createDirectory() { 
     directory = new File(
     Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyFolder"); 
     if (!directory.exists()) 
      directory.mkdirs(); 
    } 
} 

답변

0

MediaStore에서 가져올 방법이 없습니다. MediaStore.ACTION_IMAGE_CAPTURE에 대한 문서로

는 말한다 :

호출자이 이미지 를 기록 할 위치를 제어 할 수있는 추가 EXTRA_OUTPUT을 전달할 수 있습니다. EXTRA_OUTPUT이 없으면 여분의 필드에 작은 크기의 이미지가 Bitmap 객체로 반환됩니다. 작은 이미지 만 필요한 응용 프로그램에 유용한 입니다. EXTRA_OUTPUT이 있으면 전체 크기 이미지가 에 EXTRA_OUTPUT의 Uri 값으로 기록됩니다.

따라서 작은 이미지를 수신하거나 내 테스트 장치에서 이미지를 전혀 수신하지 않는 것은 예상되는 동작입니다. 원본 치수를 얻으려면 이미지를 직접 해독해야한다고 생각합니다. 다음과 같은 :

public class MyActivity extends Activity { 

    private static final String TAG = "MyActivity"; 
    File directory; 
    final int TYPE_PHOTO = 1; 
    final int REQUEST_CODE_PHOTO = 1; 

    ImageView imageViewPhoto; 
    private Uri mFileUri; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     setContentView(R.layout.activity_main); 

     createDirectory(); 
     imageViewPhoto = (ImageView) findViewById(R.id.imageViewPhoto); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(final Menu menu) { 
     getMenuInflater().inflate(R.menu.action_bar, menu); 
     return true; 
    } 

    public void onClickPhoto(View view) { 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

     mFileUri = generateFileUri(TYPE_PHOTO); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, mFileUri); 
     startActivityForResult(intent, REQUEST_CODE_PHOTO); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, 
            Intent intent) { 
     if (requestCode == REQUEST_CODE_PHOTO) { 
      if (resultCode == RESULT_OK) { 
       imageViewPhoto.setImageURI(mFileUri); 

       new SetPictureTask(getApplicationContext(), mFileUri, imageViewPhoto).execute(); 
      } else if (resultCode == RESULT_CANCELED) { 
       Log.d(TAG, "Canceled"); 
      } 
     } 
    } 

    private Uri generateFileUri(int type) { 
     File file = null; 
     switch (type) { 
      case TYPE_PHOTO: 
       file = new File(directory.getPath() + "/" + "photo_" 
         + System.currentTimeMillis() + ".jpg"); 
       break; 
     } 
     Log.d(TAG, "fileName = " + file); 
     return Uri.fromFile(file); 
    } 

    private void createDirectory() { 
     directory = new File(
       Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyFolder"); 
     if (!directory.exists()) 
      directory.mkdirs(); 
    } 

    private static class SetPictureTask extends AsyncTask<Void, Void, Void> { 
     private final ImageView mImageView; 
     private final Uri mFileUri; 
     private final Context mContext; 

     private Bitmap mBitmap; 
     private int mWidth; 
     private int mHeight; 

     public SetPictureTask(final Context context, final Uri fileUri, final ImageView imageViewPhoto) { 
      mImageView = imageViewPhoto; 
      mFileUri = fileUri; 
      mContext = context; 
     } 

     @Override 
     protected Void doInBackground(final Void... params) { 
      BitmapFactory.Options opts = new BitmapFactory.Options(); 

      opts.inJustDecodeBounds = true; 

      BitmapFactory.decodeFile(mFileUri.getPath(), opts); 

      mWidth = opts.outWidth; 
      mHeight = opts.outHeight; 

      // required width for image in order to decode faster and consume less memory 
      final int scaleFactor = Math.min(mWidth/mImageView.getWidth(), mHeight/mImageView.getHeight()); 

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

      mBitmap = BitmapFactory.decodeFile(mFileUri.getPath(), opts); 

      return null; 
     } 

     @Override 
     protected void onPostExecute(final Void aVoid) { 
      mImageView.setImageBitmap(mBitmap); 

      Toast.makeText(mContext, "Bitmap dimensions are (" + mWidth + " x " + mHeight + ")", Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

점점 치수 AsyncTask를 추가 기록하고 Bitmap을 디코딩하여주십시오.