美文网首页图像处理
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