一、完成该功能要具备以下知识点
得到位图Bitmap的方式我总结了四种方式,不管哪种方式得到的图片相关的位图,
都可以用ImageView对象的setImageBitmap(Bitmap bitmap)函数,把与位图相关的图片设置在ImageView中显示出来
(1)从sdcard中图片路径去取,本例就是采取这种方式 ,如下面的代码,
filename代表图片的路径
Bitmap bm = BitmapFactory.decodeFile(fileName);
(2)从项目的/res/drawable中去取
Bitmap bm = ((BitmapDrawable)getResources().getDrawable(R.drawable.icon)).getBitmap();
或
java.io.InputStream is = getResources().openRawResource(R.drawable.icon);
BitmapFactory.Option opts = new BitmapFactory.Options();
opts.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeStream(is,null,opts);
(3)从布局文件中的ImageView中去取 (以下代码中imageView是一个ImageView对象,该对象中已经设置了图片)
BitmapDrawable bitmapDrawable = (BitmapDrawable) imageView.getDrawable();
Bitmap bitmap = bitmapDrawable.getBitmap();
(4)从socket中去取
socket读取出的图片内容保存到byte数组中(假设byte数组名是 b,并且b的长度与图片内容长度相等)
Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length);
二、Android改变位图(图片)大小
如果想改变图片的大小,可以先得到图片的位图对象后,改变位图大小,再设置到ImageView中去,
本编讲的是怎样改变位图的大小示例,该示例把位图放大了1/4
(假设bm是位图Bitmap对象, iv是ImageView对象,int curDegrees = 0)
int bmpW = bm.getWidth();
int bmpH = bm.getHeight();
//设置图片放大比例
double scale = 1.25;
//计算出缩放比例的比例
int scaleW = 1;
int scaleH = 1;
scaleW = (float)(scaleW*scale);
scaleH = (float)(scaleH*scale);
//产生reSize后的Bitmap对象
android.graphics.Matrix mt = new android.graphics.Matrix();
mt.postScale(scaleW, scaleH);
Bitmap resizeBmp = Bitmap.createBitmap(bm, 0, 0, bmpW, bmpH, mt, true);
三、旋转图片
(以下示例是把图片放大四分之一再旋转,假设bm是位图Bitmap对象, iv是ImageView对象,int curDegrees = 0)
int bmpW = bm.getWidth();
int bmpH = bm.getHeight();
//设置图片放大比例
double scale = 1.25;
//计算出这次要放大的比例
int scaleW = 1;
int scaleH = 1;
scaleW = (float)(scaleW*scale);
scaleH = (float)(scaleH*scale);
//产生reSize后的Bitmap对象
android.graphics.Matrix mt = new android.graphics.Matrix();
//设置位图缩放比例
mt.postScale(scaleW, scaleH);
//设置位图旋转程度
mt.setRotate(curDegrees = curDegrees + 5);
//设置例设置好的位图缩放比例与旋转程度改变位图
Bitmap resizeBmp = Bitmap.createBitmap(bm, 0, 0, bmpW, bmpH, mt, true);
//把位图显示到ImageView中去
iv.setImageBitmap(resizeBmp);
四、下面做一个完整的示例,功能是可以缩放图片也可以旋转图片?
1、第一步:
布局文件/res/layout/main.xml内容
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="" />
<ImageView android:id="@+id/ImageView1"
android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button android:id="@+id/Button1"
android:text="缩小"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="200px"></Button>
<Button android:id="@+id/Button2"
android:text="放大"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_toRightOf="@id/Button1"
android:layout_marginLeft="30px"
android:layout_alignTop="@id/Button1"></Button>
<Button android:id="@+id/Button3"
android:text="左旋"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_toRightOf="@id/Button2"
android:layout_marginLeft="30px"
<Button android:id="@+id/Button4"
android:text="右旋"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_toRightOf="@id/Button3"
android:layout_marginLeft="30px"
android:layout_alignTop="@id/Button1"></Button>
</RelativeLayout>
</LinearLayout>
2、第二步
java代码
package com.fs.com;
import java.io.File;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;//ImageView、Bitmap、BitmapFactory以及Matrix的使用
public class MainActivity extends Activity {
//图片自己在相应目录下加上就行了
private String fileName = "/sdcard/qq.JPG";//
private Button zoomOutBtn;//缩小按钮
private Button zoomInBtn;//放大按钮
private Button rotateLeftBtn;//左转按钮
private Button rotateRightBtn;//右转按钮
private Bitmap bm;//图片资源Bitmap
private float scaleW = 1;//横向缩放系数,1表示不变
private float scaleH = 1;//纵向缩放系数,1表示不变
private float curDegrees = 0;//当前旋转度数
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
iv = (ImageView)findViewById(R.id.ImageView1);
zoomOutBtn = (Button)findViewById(R.id.Button1);
zoomInBtn = (Button)findViewById(R.id.Button2);
rotateLeftBtn = (Button)findViewById(R.id.Button3);
rotateRightBtn = (Button)findViewById(R.id.Button4);
File f = new File(fileName);
if(f.exists()){
//此外,你还可以使用BitmapFactory的decodeResource方法获得一个Bitmap对象
//使用decodeResource方法时传入的是一个drawable的资源id
//还有一个decodeStream方法,这个方法传入一个图片文件的输入流即可!
bm = BitmapFactory.decodeFile(fileName);
//设置ImageView的显示图片
iv.setImageBitmap(bm);
}else{
Toast.makeText(this, "文件不存在!", Toast.LENGTH_SHORT).show();
}
//缩小按钮事件处理
zoomOutBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
small();
}
});
//放大按钮事件处理
zoomInBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
big();
}
});
//左转按钮事件处理
rotateLeftBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
left();
}
});
//右转按钮事件处理
rotateRightBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
right();
}
});
}
//缩小事件处理
private void small(){
//根据getWidth和getHeight方法获取Bitmap资源的宽和高
int bmpW = bm.getWidth();
int bmpH = bm.getHeight();
//设置图片缩小比例
double scale = 0.8;
//计算出这次要缩小的比例
scaleW = (float)(scaleW*scale);
scaleH = (float)(scaleH*scale);
//产生reSize后的Bitmap对象
//注意这个Matirx是android.graphics底下的那个
Matrix mt = new Matrix();
//设置缩放系数,分别为原来的0.8和0.8
//如果设置为1,1,则是原来的尺寸
mt.postScale(scaleW, scaleH);
//根据缩放系数把原来的Bitmap资源bm进行缩放
//参数一为原来的Bitmap资源bm
//参数二和三为Bitmap所处的左上角坐标位置
//参数四和五为原来Bitmap资源bm的宽和高
//参数六为缩放系数参数
//参数七为是否过滤
//得到缩放后的Bitmap位图资源
Bitmap resizeBmp = Bitmap.createBitmap(bm, 0, 0, bmpW, bmpH, mt, true);
//重新设置ImageView显示的Bitmap位图资源图片
iv.setImageBitmap(resizeBmp);
}
//放大事件处理
private void big(){
int bmpW = bm.getWidth();
int bmpH = bm.getHeight();
//设置图片放大比例
double scale = 1.25;
//计算出这次要放大的比例
scaleW = (float)(scaleW*scale);
scaleH = (float)(scaleH*scale);
//产生reSize后的Bitmap对象
//注意这个Matirx是android.graphics底下的那个
Matrix mt = new Matrix();
mt.postScale(scaleW, scaleH);
Bitmap resizeBmp = Bitmap.createBitmap(bm, 0, 0, bmpW, bmpH, mt, true);
iv.setImageBitmap(resizeBmp);
}
//左转事件处理
private void left(){
ImageView imageView = null;
int bmpW = bm.getWidth();
int bmpH = bm.getHeight();
//设置图片放大比例
double scale = 1;
//计算出这次要放大的比例
scaleW = (float)(scaleW*scale);
scaleH = (float)(scaleH*scale);
//产生reSize后的Bitmap对象
//注意这个Matirx是android.graphics底下的那个
Matrix mt = new Matrix();
mt.postScale(scaleW, scaleH);
//设置旋转角度
//如果是设置为0则表示不旋转
//设置的数是负数则向左转
//设置的数是正数则向右转
mt.setRotate(curDegrees = curDegrees-5);
Bitmap resizeBmp = Bitmap.createBitmap(bm, 0, 0, bmpW, bmpH, mt, true);
iv.setImageBitmap(resizeBmp);
}
//右转事件处理
private void right(){
int bmpW = bm.getWidth();
int bmpH = bm.getHeight();
//设置图片放大比例
double scale = 1;
//计算出这次要放大的比例
scaleW = (float)(scaleW*scale);
scaleH = (float)(scaleH*scale);
//产生reSize后的Bitmap对象
//注意这个Matirx是android.graphics底下的那个
Matrix mt = new Matrix();
mt.postScale(scaleW, scaleH);
mt.setRotate(curDegrees = curDegrees + 5);
Bitmap resizeBmp = Bitmap.createBitmap(bm, 0, 0, bmpW, bmpH, mt, true);
iv.setImageBitmap(resizeBmp);
}
}