前言:

Bitmap就是位图,使用像素矩阵来表示图片的一种形式。使用API可以很轻松地对Bitmap文件进行各种封装后数学运算来达到修改的目的。在Android中,常见的类有BitmapMatrix及其提供的方法。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.效果图:

原图:

RemoteViews setImageViewBitmap如何让bitmap全充满整个imageview bitmap操作_ide


放大

RemoteViews setImageViewBitmap如何让bitmap全充满整个imageview bitmap操作_android_02


扭转:

RemoteViews setImageViewBitmap如何让bitmap全充满整个imageview bitmap操作_android_03


RemoteViews setImageViewBitmap如何让bitmap全充满整个imageview bitmap操作_资源文件_04