图片处理在程序开发中也是经常用到的,手机上面经常就有图片浏览器,能将图片放大显示也能将图片显示为缩略图,同时也可以将图片竖着看或者横着看。这些都需要对图片进行处理,让其能够缩放和旋转。下面来看看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信息。