Android多媒体编程——图片的操作与处理

大图片加载

  • 手机屏幕320*480,总像素:153600
  • 图片宽高2400*3200,总像素7680000
  • 手机的屏幕加载不了图片的像素,就会出现内存的溢出

处理大图片的方式

按照屏幕的宽高来缩放图片

图片缩放计算
* 2400 / 320 = 7 
* 3200 / 480 = 6


   
   
img = ((ImageView) findViewById(R.id.img_iv));
//只解析图片的宽高 Option类的常量设置
BitmapFactory.Options op = new BitmapFactory.Options();
op.inJustDecodeBounds = true;
/**
* 当设置options的常量inJustDecodeBounds为true的时候,解析器返回的Bitmap对象为空
* 只会解析到图片的信息
*/
BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/dog.jpg",op);
//TODO 获取图片的宽高
int imageWidth = op.outWidth;
int imageHeight = op.outHeight;
//TODO 获取屏幕的宽高
Display display = getWindowManager().getDefaultDisplay();
int screenWidth;
int screenHight;
//判断SDK版本,使用不同的api
if(Build.VERSION.SDK_INT>8)
{
Point point = new Point();
display.getSize(point);
screenHight = point.y;
screenWidth = point.x;
}else{
screenWidth = display.getWidth();
screenHight = display.getHeight();
}
//设置缩放比例
int scale = 1;
//判断缩放比例,取大的
int scaleWidth = imageWidth/screenWidth;
int scaleHeight = imageHeight/screenHight;
if(scaleWidth>=scaleHeight&&scaleWidth>=1){
scale = scaleWidth;
}else if(scaleWidth<scaleHeight&&scaleHeight>=1)
{
scale = scaleHeight;
}
//设置图片设置参数的缩放比例
op.inSampleSize = scale;
//关闭只解析宽高
op.inJustDecodeBounds = false;
//解析图片
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory() + "/dog.jpg", op);
if (bitmap != null) {
img.setImageBitmap(bitmap);
} else {
Toast.makeText(MainActivity.this, "图片不存在", Toast.LENGTH_SHORT).show();
}

在内存中创建图片的副本

直接加载的bitmap对象是只读的,无法修改,要修改图片只能在内存中创建出一个一模一样的bitmap副本,然后修改副本,原图加载完成后就无效了。

    //加载原图
    Bitmap srcBm = BitmapFactory.decodeFile("sdcard/photo3.jpg");
    iv_src.setImageBitmap(srcBm);

    //创建与原图大小一致的空白bitmap
    Bitmap copyBm = Bitmap.createBitmap(srcBm.getWidth(), srcBm.getHeight(), srcBm.getConfig());
    //定义画笔
    Paint paint = new Paint();
    //把纸铺在画版上
    Canvas canvas = new Canvas(copyBm);
    //把srcBm的内容绘制在copyBm上
    canvas.drawBitmap(srcBm, new Matrix(), paint);

    iv_copy.setImageBitmap(copyBm);

对图片进行特效处理

  • 首先定义一个矩阵对象

    设置矩阵的时候需要,set是第一次生效,如果想用第二次生效的效果则需要设置post 

    Matrix mt = new Matrix();
    
  • 缩放效果

    //x轴缩放1倍,y轴缩放0.5倍
    mt.setScale(1, 0.5f);
    
  • 旋转效果

    //以copyBm.getWidth() / 2, copyBm.getHeight() / 2点为轴点,顺时旋转30度
    mt.setRotate(30, copyBm.getWidth() / 2, copyBm.getHeight() / 2);
    
  • 平移

    //x轴坐标+10,y轴坐标+20
    mt.setTranslate(10, 20);
    
  • 镜面

    //把X坐标都变成负数
    mt.setScale(-1, 1);
    //图片整体向右移
    mt.postTranslate(copyBm.getWidth(), 0);
    
  • 倒影

    //把Y坐标都变成负数
    mt.setScale(1, -1);
    //图片整体向下移
    mt.postTranslate(0, copyBm.getHeight());
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值