canvas.drawBitmap()画出来的bitmap和原bitmap大小不同,有一部分缺失了

造成这个问题的原因就在于安卓系统会根据bitmap的density和当前运行设备的density进行比较,不同会进行缩放。

项目里的图片叫 ic_launcher.png,大小是72*72,只有一张,放到了drawable-xhdpi的文件夹里了

代码是这样的:

  val srcBitmap=BitmapFactory.decodeResource(resources,R.drawable.ic_launcher,opt).copy(Bitmap.Config.ARGB_8888,true);
  opt.inScaled = false         //设置这个属性防止因为不同的dpi文件夹导致缩放
  opt.inPreferredConfig=Bitmap.Config.ARGB_8888
  var bitmap= Bitmap.createBitmap(srcBitmap.width,srcBitmap.height,Bitmap.Config.ARGB_8888)
  canvas= Canvas(bitmap)
  canvas.drawBitmap(bitmap, 0f, 0f, null)

这里创建了一个原图大小的bitmap对象srcBitmap(加了opt.inScaled为false,设置这个属性decode bitmap时安卓系统将不会根据density进行自动缩放)

然后拿着创建好的srcBitmap去drawBitmap到我们新建的bitmap对象中,这时会发现画出来的bitmap右边和下边是缺失的,不是完整的一张图片

原因是这样的,我一开始把ic_launcher.png放到了xhdpi文件夹里,这个文件夹对应的density是320,然后我的安卓机子是xxhdpi的,也就是480的,我们通过decodeResource出来的srcBitmap对象的density属性是320(因为放在xhdpi里),然后它和运行的机子的density不一致,系统就拿去放大了,也就是放大到了72*(480/320)
=108 px,然后我们新建出来的bitmap对象传入的是 srcBitmap.width, srcBitmap.height(72,72),所以最终画出来的图片只有放大后的108的图片的72大小,剩下的被截掉了,同理,imageView.setImageBitmap()这个方法也会有放大缩小的问题

解决方法

   val opt = BitmapFactory.Options()
   opt.inScaled = false         //设置这个属性防止因为不同的dpi文件夹导致缩放
   opt.inPreferredConfig=Bitmap.Config.ARGB_8888
   var bitmap=BitmapFactory.decodeResource(resources,R.drawable.ic_launcher,opt).copy(Bitmap.Config.ARGB_8888,true);
   bitmap.density= resources.displayMetrics.densityDpi
   canvas= Canvas(bitmap)
   canvas.drawBitmap(bitmap, 0f, 0f, null)

加上这么一句话bitmap.density= resources.displayMetrics.densityDpi,修改bitmap的density为运行设备上的density就可以了

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值