Android优化之bitmap图片

      在android项目的imageview中使用大图bitmap时会占据很大的内存,而且在很多时候我们并不需要显示原图那么大的图片,比如一个100*100的图片,我们只需要显示50*50,直接设置的话会造成大量的内存浪费。

     所以我们需要对图片进行优化,减少内存开销。我们会使用BitmapFactory.Options的方法来进行图片缩放,先介绍几个重要的属性。

inJustDecodeBounds:这个属性当设置为true时,在bitmapfactory创建bitmap对象时,我们仍然可以获取到bitmap的属性,但是不会分配内存,这时我们就能对其操作进行缩小或者放大。

inSampleSize:设置图片缩放的比例,比如设为2时,长宽各缩放两倍,然后整个图片缩小了4倍。

 private Bitmap swapBitmap(float imagew ,float imageh ,int id){
    	BitmapFactory.Options options = new BitmapFactory.Options();
    	options.inJustDecodeBounds = true; //先设置为true再decode图片资源,节省内存
    	bitmap = BitmapFactory.decodeResource(getResources(), id, options);
    	int yRadio = (int) Math.ceil(options.outHeight / imageh);
    	int xRadio = (int) Math.ceil(options.outWidth / imagew);
    	if (yRadio > 1 || xRadio >1) {
			if (yRadio > xRadio) {
				options.inSampleSize = yRadio;
			}else {
				options.inSampleSize = xRadio;
			}
		}else {
			Toast.makeText(this, "insimplesize的值 : 1" ,Toast.LENGTH_SHORT).show();
		}
    	options.inJustDecodeBounds = false;
    	bitmap = BitmapFactory.decodeResource(getResources(),id, options);
    	return bitmap;
    }
这个方法参数为预计缩放的宽,高,以及图片资源的id,宽高是px格式的。

调用如下:

 Bitmap bitmap2 = swapBitmap(50, 50,R.drawable.ic_launcher);
       view.setImageBitmap(bitmap2);
另外因为我们在上面设置的是px,在不同分辨率的手机上会显示出差异,所以需要将预先设置的dp转为px.

 //dp convert to px
    private int dp2px(float dipValue){
    	 float scale = getResources().getDisplayMetrics().density;
         Log.i("scale", String.valueOf(scale));
         return (int) (dipValue*scale+0.5f);
    }
    //px convert to dp
    private int px2dp(float pxValue){
    	float scale = getResources().getDisplayMetrics().density;
    	Log.i("scale", String.valueOf(scale));
    	return (int) (pxValue / scale +0.5f);
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在 Android 上合成多个 Bitmap 图片,可以使用 Canvas 类和 Bitmap 类。下面是一个简单的示例: 1. 创建一个空的 Bitmap 对象,作为最终合成的图片: ```java Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(result); ``` 2. 将需要合成的 Bitmap 依次绘制到空的 Bitmap 上: ```java canvas.drawBitmap(bitmap1, x1, y1, null); canvas.drawBitmap(bitmap2, x2, y2, null); canvas.drawBitmap(bitmap3, x3, y3, null); ``` 3. 最后,可以保存合成后的 Bitmap图片文件或者显示ImageView 中: ```java imageView.setImageBitmap(result); ``` 完整的代码示例: ```java public Bitmap mergeBitmaps(Bitmap bitmap1, Bitmap bitmap2, Bitmap bitmap3) { int width = bitmap1.getWidth(); int height = bitmap1.getHeight() + bitmap2.getHeight() + bitmap3.getHeight(); Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(result); canvas.drawBitmap(bitmap1, 0, 0, null); canvas.drawBitmap(bitmap2, 0, bitmap1.getHeight(), null); canvas.drawBitmap(bitmap3, 0, bitmap1.getHeight() + bitmap2.getHeight(), null); return result; } ``` 以上代码将三个 Bitmap 垂直合成为一个 Bitmap,第一个 Bitmap 在最上面,第二个在中间,第三个在最下面。可以根据实际需求修改代码。 ### 回答2: Android中合成bitmap图片可以使用Canvas和Paint类来实现。步骤如下: 1. 创建一个新的Bitmap对象,用于存储合成后的图片。 2. 创建一个Canvas对象,并将新的Bitmap对象与Canvas关联起来。 3. 创建一个Paint对象,并设置相关的合成属性,如颜色、透明度、画笔风格等。 4. 使用Canvas的drawBitmap()方法将多个Bitmap对象绘制到新的Bitmap上,实现图片的合成效果。 5. 最后,可以将合成后的Bitmap保存到本地文件或者显示在界面上。 以下是一个简单的示例代码: ```java // 创建合成后的Bitmap对象 Bitmap resultBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); // 创建Canvas对象,并与新的Bitmap关联 Canvas canvas = new Canvas(resultBitmap); // 创建Paint对象 Paint paint = new Paint(); // 设置合成属性 paint.setColor(Color.RED); paint.setAlpha(128); paint.setStyle(Paint.Style.FILL); // 绘制bitmap1 canvas.drawBitmap(bitmap1, matrix1, paint); // 绘制bitmap2 canvas.drawBitmap(bitmap2, matrix2, paint); // 绘制bitmap3 canvas.drawBitmap(bitmap3, matrix3, paint); // 可以依次绘制更多的bitmap ... // 保存合成后的Bitmap到本地文件 resultBitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); ``` 以上代码中,width和height表示合成后的Bitmap的宽度和高度,bitmap1、bitmap2、bitmap3等表示待合成的原始Bitmap对象,matrix1、matrix2、matrix3等表示对相应的Bitmap进行变换的Matrix对象。 通过以上步骤,就可以实现Android中的Bitmap图片合成。 ### 回答3: Android中的Bitmap是一个表示图像的类,可以用来显示图片、进行图像处理等操作。要实现Bitmap图片合成,可以通过以下步骤: 1. 创建一个新的Bitmap对象,用于存储合成后的图片。可以使用Bitmap的createBitmap()方法,指定宽度、高度和颜色格式创建一个空白的Bitmap对象。 2. 获取要合成的原始图片。可以使用BitmapFactory的decodeResource()方法,从资源文件中加载图片,并通过BitmapFactory.Options对象设置图片的缩放比例、色彩模式等参数。 3. 将原始图片绘制到新的Bitmap对象上。可以使用Canvas的drawBitmap()方法,在新的Bitmap上绘制原始图片。可以设置合成图片的位置、大小等属性。 4. 如果需要合成多张图片,重复步骤2和步骤3,将其他图片依次绘制到新的Bitmap对象上。 5. 最后,可以将合成后的Bitmap对象进行保存或显示。可以使用Bitmap的compress()方法将Bitmap对象保存到指定的输出流中,或使用ImageView等控件的setImageBitmap()方法显示合成后的图片。 需要注意的是,图片合成可能会消耗较大的内存和处理时间,特别是在合成大尺寸图片或大量图片时。为了避免内存溢出和性能问题,可以适当进行图片的压缩、缩放或分块处理,或使用异步处理方式进行合成。此外,可以通过Bitmap的回收和复用来优化内存使用。 总之,通过创建新的Bitmap对象,获取原始图片,绘制到新的Bitmap上,就可以实现Android中的图片合成功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值