Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android編程入門 >> 在Android中實現圖片縮放和旋轉

在Android中實現圖片縮放和旋轉

編輯:Android編程入門

 

圖片處理在程序開發中也是經常用到的,手機上面經常就有圖片浏覽器,能將圖片放大顯示也能將圖片顯示為縮略圖,同時也可以將圖片豎著看或者橫著看。這些都需要對圖片進行處理,讓其能夠縮放和旋轉。下面來看看Android中處理圖片縮放和旋轉的步驟。

 

Matrix是在Android中用於操作圖像的類,這個類中postScale和postRotate和分別實現圖片縮放和旋轉,具體步驟如下:

一:對圖片的縮放

(1).先加載要操作的圖片

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.gilr);

(2).然後得到以上加載圖片的高度跟寬度

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

(3).接著定義要縮放成最終的圖片高度跟寬度

int nHeight = 200; 
int nWidth = 150;

(4).接著計算縮放比例

float scaleWidth = ((float) nWidth)/width; 
float scaleHeight = ((float) nHeight)/height;

(5).然後創建Matrix對象

Matrix matrix = new Matrix();

(6).接著使用Matrix對象跟縮放比例實現縮放圖片

matrix.postScale(scaleWidth, scaleHeight);

(7).最後生成縮放後的圖片

Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,width, height, matrix, true);

二,對圖片的旋轉:

(1)Matrix matrix = new Matrix();

(2)matrix.postRotate(60);

(3)Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,width, height, matrix, true);

三,以下是對圖片進行縮放與旋轉的完整例子,完整代碼如下:

在.xml文件中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/imageview"
android:layout_width="200dp"
android:layout_height="150dp"
android:scaleType="fitCenter"
android:src="@drawable/gilr"/>

<TextView
android:id="@+id/textview1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="圖像寬度:240圖像高度:160"/>
<SeekBar
android:id="@+id/seekbar1"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:max="240"
android:progress="120"
android:layout_marginLeft="10dp"></SeekBar>
<TextView
android:id="@+id/textview2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="0度"/>
<SeekBar
android:id="@+id/seekbar2"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:max="360"></SeekBar>

</LinearLayout>

在.java文件中:

public class MainActivity extends Activity implements OnSeekBarChangeListener{

    private int minWidth = 80;  //圖片最小寬度
    private ImageView imageView;
    private TextView textView1;
    private TextView textView2;
    private SeekBar seekBar1;
    private SeekBar seekBar2;
    private Matrix matrix = new Matrix();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        imageView = (ImageView) findViewById(R.id.imageview);
        textView1 = (TextView) findViewById(R.id.textview1);
        textView2 = (TextView) findViewById(R.id.textview2);
        seekBar1 = (SeekBar) findViewById(R.id.seekbar1);
        seekBar2 = (SeekBar) findViewById(R.id.seekbar2);
        seekBar1.setOnSeekBarChangeListener(this);
        seekBar2.setOnSeekBarChangeListener(this);
        
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        seekBar1.setMax(dm.widthPixels - minWidth);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {
        // TODO 自動生成的方法存根
        if(seekBar.getId() == R.id.seekbar1){
            int newWidth = progress + mainWidth;
            int newHeight = (int)(newWidth * 3 / 4);  //圖片高寬比列一定要以.xml文件中的ImageVie中高寬比列相同,否則實效
            imageView.setLayoutParams(new LinearLayout.LayoutParams(newWidth, newHeight));  //這裡是通過布局大縮放圖片大小
            textView1.setText("圖像寬度:" + newWidth + "圖像高度" + newHeight);
        }else if (seekBar.getId() == R.id.seekbar2) {
            
             Bitmap bitmap = ((BitmapDrawable)(getResources().getDrawable(R.drawable.gilr))).getBitmap();
             matrix.setRotate(progress);//設置翻轉的角度
             bitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
            imageView.setImageBitmap(bitmap);
            textView2.setText(progress + "度");
            
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // TODO 自動生成的方法存根
        
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        // TODO 自動生成的方法存根
        
    }

    

}

注意:

Andorid.util 包下的DisplayMetrics 類提供了一種關於顯示的通用信息,如顯示大小,分辨率和字體。

為了獲取DisplayMetrics 成員,首先初始化一個對象如下:

DisplayMetrics display= new DisplayMetrics();

Log.d("DisplayMetrics ", display.toString());//直接在這裡輸出,信息都是0.

getWindowManager().getDefaultDisplay().getMetrics(display);//將當前窗口的一些信息放在DisplayMetrics類中,

Log.d("DisplayMetrics", display.toString());//然後就可以通過dispalyMetrics類來獲取當前窗口的一些信息

注:構造函數DisplayMetrics 不需要傳遞任何參數;getDefaultDisplay() 方法將取得的寬高維度存放於DisplayMetrics 對象中,而取得的寬高維度是以像素為單位(Pixel) ,“像素”所指的是“絕對像素”而非“相對像素”。

通過 DisplayMetrics的 toString()方法可以獲取到 DisplayMetrics的大部分 fields信息。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved