前言:
Bitmap
就是位图,使用像素矩阵来表示图片的一种形式。使用API可以很轻松地对Bitmap
文件进行各种封装后数学运算来达到修改的目的。在Android中,常见的类有Bitmap
,Matrix
及其提供的方法。Bitmap
用于存放媒体资源文件,Matrix
用于进行矩阵运算。两者综合可以完成很复杂的图片操作。
一:Bitmap
的创建
- 使用
BitmapFactory.decodeResource()
来创建 - 使用
Bitmap.createBitmap()
来创建
两者均可创建Bitmap,不同的是,BitmapFactory.decodeResource()
可根据已存在的资源文件进行创建(R.drwable.xxx
),Bitmap.createBitmap()
则根据一个已存在的Bitmap对象创建。示例如下:
BitmapFactory.decodeResource() | Bitmap.createBitmap() |
---|---|
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.benz); | Bitmap bitmap1 = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false); |
BitmapFactory.decodeResource()
各参数意义如下:
- 第一个为资源来源,如无特殊需要填写
getResources()
即可; - 第二个为资源文件。
Bitmap.createBitmap()
各参数意义如下:
- 第一个为一个已存在的
Bitmap
对象实例; - 第二、三个为源对象的左上角坐标(Android系统中坐标原点在左上角,x坐标正轴为向右,y坐标正轴为向下);
- 第四、五个为源对象的宽和高;
- 第六个为矩阵变换数据,即
Matrix
对象; - 第七个为是否要使用过滤器对象。
二:Matrix
的使用
该对象的创建非常简单,如下:
Matrix matrix = new Matrix();
Matrix对象的意义在于其提供的各种方法,常见如下:
(注意“预操作”即方法开头为pre
的解释)
setScale()
:设置缩放比例setSkew()
:设置旋转方向。顺时针旋转角度为正,逆时针为负;setRotate()
:设置扭转。可在水平和竖直两个方向扭转;preScale()
:设置缩放比例,与setScale()
不同的是,其是“预操作”,不会对上一步做出撤销;preSkew()
:设置旋转方向。顺时针旋转角度为正,逆时针为负。其为“预操作”;preRotate()
:设置扭转。可在水平和竖直两个方向扭转。其为“预操作”。
三:操作类的实现
1:缩放
private void setImageViewEnlarge(){
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.benz);
Matrix matrix = new Matrix();
matrix.setScale(1.5f, 1.5f);
Bitmap bitmap1 = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);
imageView.setImageBitmap(bitmap1);
}
2:旋转
private void setImageViewRevolve(){
Matrix matrix = new Matrix();
matrix.preRotate(90f);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.benz);
Bitmap bitmap1 = Bitmap.createBitmap(bitmap, 0, 0 , bitmap.getWidth(), bitmap.getHeight(), matrix, false);
imageView.setImageBitmap(bitmap1);
}
3:扭转
仅在水平方向扭转
private void setImageViewWryX(){
Matrix matrix = new Matrix();
matrix.preSkew(1f, 0f);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.benz);
Bitmap bitmap1 = Bitmap.createBitmap(bitmap, 0, 0 , bitmap.getWidth(), bitmap.getHeight(), matrix, false);
imageView.setImageBitmap(bitmap1);
}
在水平和竖直方向同时扭转
private void setImageViewWryY(){
Matrix matrix = new Matrix();
matrix.preSkew(0.5f, 0.5f);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.benz);
Bitmap bitmap1 = Bitmap.createBitmap(bitmap, 0, 0 , bitmap.getWidth(), bitmap.getHeight(), matrix, false);
imageView.setImageBitmap(bitmap1);
}
若是不太理解,下面为全部代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private ImageView imageView;
private Button buttonEnlarge;
private Button buttonRevolve;
private Button buttonWryX;
private Button buttonWryY;
private void intView(){
imageView = (ImageView) findViewById(R.id.image_view);
buttonEnlarge = (Button) findViewById(R.id.button_enlarge);
buttonRevolve = (Button) findViewById(R.id.button_revolve);
buttonWryX = (Button) findViewById(R.id.button_wry_x);
buttonWryY = (Button) findViewById(R.id.button_wry_y);
}
private void setListener(){
buttonEnlarge.setOnClickListener(this);
buttonRevolve.setOnClickListener(this);
buttonWryX.setOnClickListener(this);
buttonWryY.setOnClickListener(this);
}
private void setImageViewEnlarge(){
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.benz);
Matrix matrix = new Matrix();
matrix.setScale(1.5f, 1.5f);
Bitmap bitmap1 = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false);
imageView.setImageBitmap(bitmap1);
}
private void setImageViewRevolve(){
Matrix matrix = new Matrix();
matrix.preRotate(90f);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.benz);
Bitmap bitmap1 = Bitmap.createBitmap(bitmap, 0, 0 , bitmap.getWidth(), bitmap.getHeight(), matrix, false);
imageView.setImageBitmap(bitmap1);
}
private void setImageViewWryX(){
Matrix matrix = new Matrix();
matrix.preSkew(1f, 0f);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.benz);
Bitmap bitmap1 = Bitmap.createBitmap(bitmap, 0, 0 , bitmap.getWidth(), bitmap.getHeight(), matrix, false);
imageView.setImageBitmap(bitmap1);
}
private void setImageViewWryY(){
Matrix matrix = new Matrix();
matrix.preSkew(0.5f, 0.5f);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.benz);
Bitmap bitmap1 = Bitmap.createBitmap(bitmap, 0, 0 , bitmap.getWidth(), bitmap.getHeight(), matrix, false);
imageView.setImageBitmap(bitmap1);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intView();
setListener();
}
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button_enlarge:
setImageViewEnlarge();
break;
case R.id.button_revolve:
setImageViewRevolve();
break;
case R.id.button_wry_x:
setImageViewWryX();
break;
case R.id.button_wry_y:
setImageViewWryY();
break;
default:
break;
}
}
}
4.效果图:
原图:
放大
扭转:
更多推荐
Bitmap快速入手之具体操作(缩放、旋转、扭转)
发布评论