마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

갤러리에서 사진 가져올때 회전되서 보여지는 문제

0 추천
public class Main extends Activity {
 ProgressDialog mLoagindDialog;
 GridView mGvImageList;
 ImageAdapter mListAdapter;
 ArrayList<ThumbImageInfo> mThumbImageInfoList;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.image_list_view);

  mThumbImageInfoList = new ArrayList<ThumbImageInfo>();
  mGvImageList = (GridView) findViewById(R.id.gvImageList);

  new DoFindImageList().execute();
 }

 private long findThumbList() {
  long returnValue = 0;

  // Select 하고자 하는 컬럼
  String[] projection = { MediaStore.Images.Media._ID,
    MediaStore.Images.Media.DATA };

  // 쿼리 수행
  Cursor imageCursor = getContentResolver().query(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null,
    null, MediaStore.Images.Media.DATE_ADDED + " desc ");

  if (imageCursor != null && imageCursor.getCount() > 0) {
   // 컬럼 인덱스
   int imageIDCol = imageCursor.getColumnIndex(MediaStore.Images.Media._ID);
   int imageDataCol = imageCursor.getColumnIndex(MediaStore.Images.Media.DATA);

   // 커서에서 이미지의 ID와 경로명을 가져와서 ThumbImageInfo 모델 클래스를 생성해서
   // 리스트에 더해준다.
   while (imageCursor.moveToNext()) {
    ThumbImageInfo thumbInfo = new ThumbImageInfo();

    thumbInfo.setId(imageCursor.getString(imageIDCol));
    thumbInfo.setData(imageCursor.getString(imageDataCol));
    thumbInfo.setCheckedState(false);

    mThumbImageInfoList.add(thumbInfo);
    returnValue++;
   }
  }
  imageCursor.close();
  return returnValue;
 }

 // 화면에 이미지들을 뿌려준다.
 private void updateUI() {
  mListAdapter = new ImageAdapter(this, R.layout.image_cell,
    mThumbImageInfoList);
  mGvImageList.setAdapter(mListAdapter);
 }

 static class ImageViewHolder {
  ImageView ivImage;
  CheckBox chkImage;
 }

 private class ImageAdapter extends BaseAdapter {
  private Context mContext;
  private int mCellLayout;
  private LayoutInflater mLiInflater;
  private ArrayList<ThumbImageInfo> mThumbImageInfoList;

  public ImageAdapter(Context c, int cellLayout,ArrayList<ThumbImageInfo> thumbImageInfoList) {
   mContext = c;
   mCellLayout = cellLayout;
   mThumbImageInfoList = thumbImageInfoList;

   mLiInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  }

  public int getCount() {
   return mThumbImageInfoList.size();
  }

  public Object getItem(int position) {
   return mThumbImageInfoList.get(position);
  }

  public long getItemId(int position) {
   return position;
  }

  public View getView(int position, View convertView, ViewGroup parent) {
   if (convertView == null) {
    convertView = mLiInflater.inflate(mCellLayout, parent, false);
    ImageViewHolder holder = new ImageViewHolder();

    holder.ivImage = (ImageView) convertView.findViewById(R.id.ivImage);
    holder.chkImage = (CheckBox) convertView.findViewById(R.id.chkImage);

    convertView.setTag(holder);
   }

   final ImageViewHolder holder = (ImageViewHolder) convertView
     .getTag();

   if (((ThumbImageInfo) mThumbImageInfoList.get(position)).getCheckedState())
    holder.chkImage.setChecked(true);
   else
    holder.chkImage.setChecked(false);

   try {
    String path = ((ThumbImageInfo) mThumbImageInfoList.get(position)).getData();

    BitmapFactory.Options option = new BitmapFactory.Options();

    if (new File(path).length() > 100000)
     option.inSampleSize = 10;
    else
     option.inSampleSize = 2;

    Bitmap bmp = BitmapFactory.decodeFile(path, option);
    holder.ivImage.setImageBitmap(bmp);

    setProgressBarIndeterminateVisibility(false);
   } catch (Exception e) {
    e.printStackTrace();
    setProgressBarIndeterminateVisibility(false);
   }

   return convertView;
  }
 }

 private class DoFindImageList extends AsyncTask<String, Integer, Long> {
  @Override
  protected void onPreExecute() {
   mLoagindDialog = ProgressDialog.show(Main.this, null, "로딩중...",
     true, true);
   super.onPreExecute();
  }

  @Override
  protected Long doInBackground(String... arg0) {
   long returnValue = 0;
   returnValue = findThumbList();
   return returnValue;
  }

  @Override
  protected void onPostExecute(Long result) {
   updateUI();
   mLoagindDialog.dismiss();
  }

  @Override
  protected void onCancelled() {
   super.onCancelled();
  }
 }

 

안녕하세요.

스마트폰 갤러리의 이미지를 가져와서 gridview로 뿌려주는 소스인데요.

findThumbList() 메소드로 이미지를 select 한 후 ImageAdapter의 getview로 gridview에 이미지를 출력하도록 했습니다.

그런데 테스트 해보니 몇몇 사진들이 회전되어서 나오더라구요. 90도, 180도, 270도 가지각색입니다.  

소스에서 사진을 회전시키는 부분은 없는데 혹시 imageview에 넣을때 크기에 관계가 있는건가요?

도움주시면 감사하겠습니다. 

익명사용자 님이 2014년 5월 7일 질문

1개의 답변

+1 추천
device를 회전해서 찍은 사진을 그대로 가져오는 경우 회전되서 보여집니다.

MediaStore나 Exif 정보에 회전 값을 가져올 수 있으니 출력하기 전에 회전시켜야 합니다.
익명사용자 님이 2014년 5월 7일 답변
감사합니다. 해결했습니다!!
...