2011-06-20 129 views
20

我想知道如何縮放位圖到屏幕的高度和寬度?如何將位圖縮放到屏幕大小?

任何人都可以告訴我如何做到這一點。

感謝 Monali

+0

你有什麼?包含ImageView,或者位圖/ Drawable和Canvas的佈局? – Kaj

+0

你有檢查過這些嗎? – Venky

+0

如果佈局是畫布,科爾多瓦會自動縮放畫布以適應不同的屏幕尺寸,還是我們必須手動執行? – bouncingHippo

回答

27

試試這個解碼位圖:

其中imagefilepath是圖像的路徑名稱,它將在String中隱含,通過使用

File photos= new File(imageFilePath); 

照片是圖像的文件名文件,現在你根據:您的要求設置了高度和寬度。

public void main(){ 
    Bitmap bitmap = decodeFile(photo); 
    bitmap = Bitmap.createScaledBitmap(bitmap,150, 150, true); 
    imageView.setImageBitmap(bitmap); 
} 

private Bitmap decodeFile(File f){ 
    try { 
     //decode image size 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(new FileInputStream(f),null,o);    
     //Find the correct scale value. It should be the power of 2. 
     final int REQUIRED_SIZE=70; 
     int width_tmp=o.outWidth, height_tmp=o.outHeight; 
     int scale=1; 
     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; 
     return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
    } catch (FileNotFoundException e) {} 
     return null; 
} 
+5

這比天真的實現更好,並使用更少的內存。 –

+0

像魅力一樣工作 –

+1

代碼中有一個小小的錯誤。它應該是'scale * = 2;'而不是scale ++; – Saqib

15

我有一個類似的挑戰,我想將寬度拉伸到屏幕的100%,但保持寬高比不變。所以,我沒有這個..

創建延伸的ScalableImageView類的ImageView:

public class ScalableImageView extends ImageView { 
    public boolean isMeasured = true; 

    public ScalableImageView(Context context) { 
     super(context); 
    } 

    public ScalableImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public ScalableImageView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     try 
     { 
      Drawable drawable = getDrawable(); 

      if (drawable == null) 
      { 
       setMeasuredDimension(0, 0); 
      } 
      else 
      { 
       int width = MeasureSpec.getSize(widthMeasureSpec); 
       int height = width * drawable.getIntrinsicHeight()/drawable.getIntrinsicWidth(); 
       setMeasuredDimension(width, height); 
      } 
     } 
     catch (Exception e) 
     { 
      isMeasured = false; 
      super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     } 
    } 
} 

在佈局XML文件,我有這樣的定義的圖像佔位符:

<ScalableImageView android:id="@+id/image1" 
    android:layout_centerHorizontal="true" 
    android:src="@drawable/cam_image_placeholder" 
    android:scaleType="fitCenter" 
    android:layout_gravity="center_horizontal" 
    android:layout_height="wrap_content" 
    android:layout_width="match_parent" 
    android:adjustViewBounds="true" 
    android:visibility="invisible" 
    android:layout_marginBottom="6px"> 
</ScalableImageView> 

而且然後加載/設置它是這樣的:

ScalableImageView imgView = null; 
imgView = (ScalableImageView)findViewById(imgViewResource); 
imgView.setImageDrawable(myDrawable); 
imgView.setVisibility(ScalableImageView.VISIBLE); 
+0

+1,適合我! – ThomasRS

+0

這對我想出如何使用僅一個維度(縮放寬度或高度)並保持正確的比例非常有用。謝謝! –

+0

適合我,非常感謝你! – VinceStyling

7

您可以使用Bitmap.createScaledBitmap(),但使s URE使用正確的換算公式,當你使用它:

final float scale = getContext().getResources().getDisplayMetrics().density; 
int pixels = (int) (dps * scale + 0.5f); 

Bitmap.createScaledBitmap()單位的寬度和高度都是「像素」,而你應該總是設置你的尺寸的密度獨立像素(DP單位)描述爲here

所以,如果你想顯示你的圖像保持密度的獨立性 - 即你的圖像會佔據屏幕的相同部分,在任何設備上 - 你需要使用類似下面的代碼:

Bitmap b = decodeScaledFile(f); 

final float scale = mContext.getResources().getDisplayMetrics().density; 
int p = (int) (SIZE_DP * scale + 0.5f); 

Bitmap b2 = Bitmap.createScaledBitmap(b, p, p, true); 
+2

其中SIZE_DP是什麼? – LuxuryMode

+0

@LuxuryMode'SIZE_DP'是密度獨立像素中圖像的大小 - 請參閱[這裏](http://developer.android.com/guide/topics/resources/more-resources.html#Dimension) –

+1

確實使用createScaledBitmap實際上創建了一個全新的位圖,因此您使用2個位圖的內存?例如,如果第一個位圖佔用x個字節,那麼縮放2的位圖會佔用2 * 2 = 4倍加上原始數據,因此總共使用大約4x + x = 5x個字節? –

0

你可以基於此代碼創建一個scaledBitmap。

private Bitmap getScaledBitMapBaseOnScreenSize(Bitmap bitmapOriginal){ 

    Bitmap scaledBitmap=null; 
    try { 
     DisplayMetrics metrics = new DisplayMetrics(); 
     getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics); 


     int width = bitmapOriginal.getWidth(); 
     int height = bitmapOriginal.getHeight(); 

     float scaleWidth = metrics.scaledDensity; 
     float scaleHeight = metrics.scaledDensity; 

     // create a matrix for the manipulation 
     Matrix matrix = new Matrix(); 
     // resize the bit map 
     matrix.postScale(scaleWidth, scaleHeight); 

     // recreate the new Bitmap 
     scaledBitmap = Bitmap.createBitmap(bitmapOriginal, 0, 0, width, height, matrix, true); 
    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 
    return scaledBitmap; 
} 

方法調用&設置縮放圖像的ImageView

Bitmap scaleBitmap=getScaledBitMapBaseOnScreenSize(originalBitmapImage); 
    if(scaleBitmap!=null) { 
    imageView.setImageBitmap(scaleBitmap); 
    } 

爲ImageView的我的XML代碼,

<ImageView 
    android:id="@+id/image_view" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:scaleType="center" 
    /> 
相關問題