2014-06-05 73 views
1

我已經看到了關於這個話題的幾個問題,但是沒有解決那我的問題。ImageView的位圖方向不正確

我動態創建ImageViews,並允許用戶採取/添加項目的照片清單。下面的代碼存在生成位圖和填充的ImageView:

protected void addPhotosToView(ArrayList<String> uris) { 
    for (String uriString : uris) { 
     try { 
      Uri uri = Uri.parse(uriString); 
      File imageFile = new File(uri.getPath()); 
      int orientation = resolveBitmapOrientation(imageFile); 
      Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); 
      bitmap = applyOrientation(bitmap, orientation); 

      ImageView image = new ImageView(ItemActivity.this); 

      int h = 100; // height in pixels 
      int w = 100; // width in pixels  
      Bitmap scaled = Bitmap.createScaledBitmap(bitmap, h, w, true); 

      image.setImageBitmap(scaled); 

      LinearLayout photoLayout = (LinearLayout) findViewById(R.id.itemPhotoLayout); 
      photoLayout.addView(image); 

      addClickListener(image, uri); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

但是一旦圖像添加或採取一些圖像顯示了錯誤的方向。縱向存儲在手機中的一些照片以縱向顯示,而其他照片則呈現橫向顯示。風景照片同樣是任意的。

這似乎並非要在

正如你可以在代碼中看到,我試圖讓所有的設備(即我看到這對設備是三星S4)發生/應用使用方向變化EXIF標籤,但我總是與該設備的定位越來越0並沒有看到該請求解決問題的任何答案時,方向始終是0

我期待儘快出貨這個軟件,並且需要某種解決方法或解決方案,所以我願意接受從Uris /字符串到動態水平滾動的正確圖像列表的其他方式,如果這不能以其他方式解決的話。

+1

看起來像我面臨的exif方向問題我通過解碼位圖和檢查EXIF方向來解決它。如果exif數據方向存在,則位圖會相應地旋轉 –

+0

我相信@IllegalArgument是正確的。但是請張貼'resolveBitmapOrientation()'和'applyOrientation()'代碼(僅從他們的名字來判斷,似乎你已經考慮到了這一點 - 也許它們在某些情況下失敗了?)。 – matiash

回答

-1

請使用此方法來顯示/解碼位圖。它是從另一個SO帖子中拿出來的,我不記得哪個和修改後用於我的用途。這種方法如果根據在圖像上存在的EXIF方向數據返回位圖:

public Bitmap decodeFile(String path) {// you can provide file path here 
    int orientation; 
    try { 
     if (path == null) { 
      return null; 
     } 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     // Find the correct scale value. It should be the power of 2. 
     final int REQUIRED_SIZE = 70; 
     // final int REQUIRED_SIZE = 20; 
     int width_tmp = o.outWidth, height_tmp = o.outHeight; 
     int scale = 0; 
     while (true) { 
      if (width_tmp/2 < REQUIRED_SIZE 
        || height_tmp/2 < REQUIRED_SIZE) 
       break; 
      width_tmp /= 2; 
      height_tmp /= 2; 
      scale++; 
     } 
     // decode with inSampleSize 
     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 
     Bitmap bm = BitmapFactory.decodeFile(path, o2); 
     Bitmap bitmap = bm; 
     ExifInterface exif = new ExifInterface(path); 
     orientation = exif 
       .getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); 
     Matrix m = new Matrix(); 
     if ((orientation == ExifInterface.ORIENTATION_ROTATE_180)) { 
      m.postRotate(180); 
      bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), 
        bm.getHeight(), m, true); 
      photo(bitmap, path); 
      return bitmap; 
     } else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { 
      m.postRotate(90); 
      bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), 
        bm.getHeight(), m, true); 
      photo(bitmap, path); 
      return bitmap; 
     } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { 
      m.postRotate(270); 
      bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), 
        bm.getHeight(), m, true); 
      photo(bitmap, path); 
      return bitmap; 
     } 
     return bitmap; 
    } catch (Exception e) { 
     return null; 
    } 

} 
+0

正如我在其他評論中說的,我在BitmapFactory.options上遇到了一些麻煩 - 任何構造它的嘗試都會導致在使用時引用它的變量的NPE。有任何想法嗎? – user3563124

+0

在這種情況下,一些代碼和logcat的輸出將是有益的,上面的代碼進行測試和對我的作品所以只是給它一個嘗試 –

1

你需要的位圖這一切嘗試this tutorial你可以下載源解碼。 該應用劑量正是你想要的,也許它會幫助你,我希望,因爲它適用於我的應用程序

+0

我有一些困難,得到這個正常工作。任何時候我嘗試創建一個新的BitmapFactory.options實例,我都會在無精確的構造函數中得到一個NPE。 – user3563124

+1

我沒有解決這個問題,所以看看這段代碼,它更容易運行,只需按照它一步一步地執行即可。 http://www.c-sharpcorner.com/UploadFile/e14021/capture-image-from-camera-and-selecting-image-from-gallery-o/ – BiLL

+0

此代碼還依賴於BitmapFactory.options,所以我由於NPE,無法遵循它。 我不傾向於認爲它是我的任何代碼,因爲沒有參數,而且對象完全由它自己構造。 – user3563124