美文网首页图像处理
Android_07 Android中Bitmap加载图片

Android_07 Android中Bitmap加载图片

作者: MengkZhang | 来源:发表于2019-05-15 18:28 被阅读0次

一:计算机表示图形的几种方式


二:Android加载大图片

原理:
[1]获取手机分辨率
[2]获取图片分辨率
创建位图工厂的配置参数
获取图片宽高
[3]计算缩放比例
[4]显示缩放后的图片

示例代码:

@SuppressLint("SdCardPath")
public class MainActivity extends Activity {

    private int height;
    private int width;

    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //[1]获取手机分辨率
        WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
        width = wm.getDefaultDisplay().getWidth();
        height = wm.getDefaultDisplay().getHeight();
        System.out.println("height:"+height+" width:"+width);
        
        //[2]获取图片分辨率
        
        //创建位图工厂的配置参数
        Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile("/mnt/sdcard/dx.jpg", options);
        
        //获取图片宽高
        int outWidth = options.outWidth;
        int outHeight = options.outHeight;
        
        System.out.println(outHeight+" "+outWidth);
        
        //[3]计算缩放比例
        int scale = 1;
        int scaleX = outWidth / width;
        int scaleY = outHeight / height;
        if (scaleX > scaleY) {
            scale = scaleX;
        } else if (scaleX < scaleY) {
            scale = scaleY;
        }
        
        //[4]显示缩放后的图片
        
        options.inSampleSize = scale;
        options.inJustDecodeBounds = false;
        
        Bitmap bm = BitmapFactory.decodeFile("/mnt/sdcard/dx.jpg", options);
        ImageView iv_bigpic = (ImageView) findViewById(R.id.iv_bigpic);
        iv_bigpic.setImageBitmap(bm);
        
//      ImageView iv_bigpic = (ImageView) findViewById(R.id.iv_bigpic);
//      Bitmap bm = BitmapFactory.decodeFile("/mnt/sdcard/dx.jpg");
//      //08-21 11:42:14.065: E/AndroidRuntime(2766): java.lang.OutOfMemoryError
//      //08-21 11:42:13.895: I/dalvikvm-heap(2766): Forcing collection of SoftReferences for 30720012-byte allocation
//
//      iv_bigpic.setImageBitmap(bm);
    }

}

三:创建一个原图的副本来操作图片

原理:
[2.1]创建一个模板 相当于 创建了一个大小和原图一样的 空白的白纸

Bitmap copybiBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());

[2.2]想作画需要一个画笔

Paint paint = new Paint();

[2.3]创建一个画布 把白纸铺到画布上

Canvas canvas = new Canvas(copybiBitmap);

[2.4]开始作画

canvas.drawBitmap(srcBitmap, new Matrix(), paint);

[2.5]操作画出来的小猫图片

copybiBitmap.setPixel(20+i, 30, Color.RED);

示例代码:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //显示原图 
        ImageView iv_src = (ImageView) findViewById(R.id.iv_src); 
        
        //显示副本 
        ImageView iv_copy = (ImageView) findViewById(R.id.iv_copy);
        
        //[1]先把tomcat.png 图片转换成bitmap 显示到iv_src
        Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.tomcat);
        
        //[1.1]操作图片 
//      srcBitmap.setPixel(20, 30, Color.RED);
        iv_src.setImageBitmap(srcBitmap);

        //[2]创建原图的副本    
        
        //[2.1]创建一个模板  相当于 创建了一个大小和原图一样的 空白的白纸 
        Bitmap copybiBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
        //[2.2]想作画需要一个画笔 
        Paint paint = new Paint();
        //[2.3]创建一个画布  把白纸铺到画布上 
        Canvas canvas = new Canvas(copybiBitmap);
        //[2.4]开始作画  
        canvas.drawBitmap(srcBitmap, new Matrix(), paint);
        
        
        //[2.5]操作画出来的小猫图片 
        for (int i = 0; i < 20; i++) {
            copybiBitmap.setPixel(20+i, 30, Color.RED);
        }
        
        
        //[3]把copybimap显示到iv_copy上
        iv_copy.setImageBitmap(copybiBitmap);
        
        
        
        
        
        
        
    }



}

程序运行结果:



四:图形处理的API

原理:
canvas.drawBitmap(srcBitmap,matrix , paint);
matrix的方法,操作图片

  • 旋转
matrix.setRotate(20, srcBitmap.getWidth()/2, srcBitmap.getHeight()/2);
  • 缩放
matrix.setScale(0.5f, 0.5f);
  • 平移
matrix.setTranslate(30, 0);
  • 镜面效果
//      matrix.setScale(-1.0f, 1);
        //post是在上一次修改的基础上进行再次修改  set 每次操作都是最新的 会覆盖上次的操作
//      matrix.postTranslate(srcBitmap.getWidth(), 0);
  • 倒影效果
        //[2,7]倒影效果
        matrix.setScale(1.0f, -1);
        //post是在上一次修改的基础上进行再次修改  set 每次操作都是最新的 会覆盖上次的操作
        matrix.postTranslate(0, srcBitmap.getHeight());

示例代码:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //显示原图 
        ImageView iv_src = (ImageView) findViewById(R.id.iv_src); 
        
        //显示副本 
        ImageView iv_copy = (ImageView) findViewById(R.id.iv_copy);
        
        //[1]先把tomcat.png 图片转换成bitmap 显示到iv_src
        Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.tomcat);
        
        //[1.1]操作图片 
//      srcBitmap.setPixel(20, 30, Color.RED);
        iv_src.setImageBitmap(srcBitmap);

        //[2]创建原图的副本    
        
        //[2.1]创建一个模板  相当于 创建了一个大小和原图一样的 空白的白纸 
        Bitmap copybiBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), srcBitmap.getConfig());
        //[2.2]想作画需要一个画笔 
        Paint paint = new Paint();
        //[2.3]创建一个画布  把白纸铺到画布上 
        Canvas canvas = new Canvas(copybiBitmap);
        //[2.4]开始作画  
        Matrix matrix = new Matrix();
        
        //[2.5]对图片进行旋转 
        //matrix.setRotate(20, srcBitmap.getWidth()/2, srcBitmap.getHeight()/2);
        
        //[2.5]对图片进行
//      matrix.setScale(0.5f, 0.5f);
        
        //[2.6]对图片进行平移
//      matrix.setTranslate(30, 0);
        
        
        //[2.7]镜面效果  如果2个方法一起用 
//      matrix.setScale(-1.0f, 1);
        //post是在上一次修改的基础上进行再次修改  set 每次操作都是最新的 会覆盖上次的操作
//      matrix.postTranslate(srcBitmap.getWidth(), 0);
        
        
        
        //[2,7]倒影效果
        matrix.setScale(1.0f, -1);
        //post是在上一次修改的基础上进行再次修改  set 每次操作都是最新的 会覆盖上次的操作
        matrix.postTranslate(0, srcBitmap.getHeight());
        canvas.drawBitmap(srcBitmap,matrix , paint);
        
        
        
        //[3]把copybimap显示到iv_copy上
        iv_copy.setImageBitmap(copybiBitmap);
        
        
        
        
        
    }



}

程序运行效果:



相关文章

网友评论

    本文标题:Android_07 Android中Bitmap加载图片

    本文链接:https://www.haomeiwen.com/subject/nfumaqtx.html