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_8888var 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_8888var bitmap=BitmapFactory.decodeResource(resources,R.drawable.ic_launcher,opt).copy(Bitmap.Config.ARGB_8888,true);bitmap.density= resources.displayMetrics.densityDpicanvas= Canvas(bitmap)canvas.drawBitmap(bitmap, 0f, 0f, null)
加上这么一句话bitmap.density= resources.displayMetrics.densityDpi,修改bitmap的density为运行设备上的density就可以了
canvas.drawBitmap()画出来的bitmap和原bitmap大小不同,有一部分缺失了相关推荐
- canvas 画点_css+canvas 随便画一个星空
今天躺在床上刷抖音的时候,看见了一个马克笔随便画星空的视频,很有意思. 先看效果: 开始需求分析: 1.渐变色的背景 2.画一颗树和一些草 3.水面的倒影 4.随便画点星星 5.画一颗流星 1.渐变色 ...
- html5 Canvas画图教程(5)—canvas里画曲线之arc方法
本文转自:http://www.jb51.net/html5/70317.html 在canvas画线条这篇文章中,我讲了画直线的方法,按理这篇画曲线的文章早该发了,但由于canvas画曲线比较特殊, ...
- 用python画机器猫代码_如何用Python画一只机器猫?| 原力计划
原标题:如何用Python画一只机器猫?| 原力计划 作者 | 人邮异步社区 责编 | 胡巍巍 出品 | CSDN博客 自信心是成功的源泉,对刚入门编程行业的初级程序员来说,多敲代码多做项目就是构建自 ...
- html5两条直线,Html5新特性用canvas标签画多条直线附效果截图
下面例子为用canvas标签画多条直线 复制代码代码如下: index_three 您的浏览器不支持canvas标签. //获取Canvas对象(画布) var canvas = document.g ...
- 使用JavaScript在Canvas上画出一片星空
随着Html5的迅猛发展,画布也变得越来越重要.下面我就写一个关于在canvas上画出一片星空的简单的代码的示例. 理论基础 初始化一个canvas,获得一个用于绘制图形的上下文环境context.并 ...
- 使用canvas 代码画小猪佩奇
使用canvas 代码画小猪佩奇 最近不是小猪佩奇很火嘛!!! 前几天 在知乎 看见了别人大佬用python写的 小猪佩奇, 顿时想学 ,可是 自己 没学过python(自己就好爬爬图片,,,,几个 ...
- Unity在Canvas上画线(Draw Line)实现
# 前言 目前Unity官方提供的UI扩展包中包含了UILineRenderer组件,本篇实现与UILineRenderer实现一致,主要讲解其基本使用与实现过程.不想看的同学可以直接下载官方扩展包. ...
- HTML canvas系列-画圆(4)
HTML canvas系列-画圆(4) 1.画圆步骤 2.属性(样式) 3.示例 -绘制圆 1.画圆步骤 画圆使用beginPath.arc.fill.stroke方法. beginPath 开始绘制 ...
- 【Bitmap】Canvas: trying to use a recycled bitmap android.graphics.Bitmap问题
Canvas: trying to use a recycled bitmap android.graphics.Bitmap问题 我这用到bitmap中间变量了,还用到 Bitmap bitmap ...
最新文章
- 开学季:当当大促的额外优惠又来啦!150 买 400的书!搓搓搓~
- AspNetDB.mdf数据库的建立和使用
- Active Diretory 全攻略(三)--建立域(2)
- 不疯狂的外星人,已疯狂的资本
- Boost:验证atomic <>不会在成员指针上提供算术运算
- DataWorks OpenAPI企业开发实战-运维监控大屏
- 【图像处理】——Python实现图像加噪(随机噪声、椒盐噪声、高斯噪声等)
- 计算机仿真技术-基于matlab的电子信息类课程课后答案,计算机仿真技术:基于MATLAB的电子信息类课程(第4版)...
- 软件开发项目云端All-In-One体验
- 用 dash_bootstrap_components 为 dash 生成美观的导航栏
- SysV和BSD启动风格的比较
- Java SE 基础:继承、封装、多态、fianl、static、abstract
- 计算机辅助翻译 教学大纲,《计算机辅助翻译》本科课程教学大纲翻译本科.doc...
- oracle if else怎么用,oracle if else语句使用介绍
- 训练集和验证集的划分
- 平年和闰年c语言程序,C语言平年,平年闰年问题
- 17届华为杯数学建模大赛B题代码
- c语言 pv操作,用C语言实现P、V操作
- 什么运动耳机好用,六款运动耳机值得推荐
- 汽车智能安装仿真测试软件,智能网联汽车仿真测试平台建设.pdf