在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);  //重新对SeekBar1设置最大值
    }

    @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信息。

 

posted @ 2016-04-13 20:55  SoulCode  阅读(700)  评论(0编辑  收藏  举报