造成这个问题的原因就在于安卓系统会根据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就可以了
今天的文章canvas.drawBitmap()画出来的bitmap和原bitmap大小不同,有一部分缺失了[通俗易懂]分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/58156.html