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

  • Post author:
  • Post category:其他


造成这个问题的原因就在于安卓系统会根据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就可以了



版权声明:本文为laigengsong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。