当前位置: 首页 > 编程日记 > 正文

Android安卓开发中图片缩放讲解

安卓开发中应用到图片的处理时候,我们通常会怎么缩放操作呢,来看下面的两种做法:

方法1:按固定比例进行缩放

在开发一些软件,如新闻客户端,很多时候要显示图片的缩略图,由于手机屏幕限制,一般情况下,我们取图片的缩略图,取缩略图的方法我们可以使用 BitmapFactory的decodeFile方法,然后通过传递进去 BitmapFactory.Option类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几 分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。但是,如果我们想取固定大小的缩略图就比较困难 了,比如,我们想将不同大小的图片取出来的缩略图高度都为200px,同时要保证图片不失真,那我们该怎么办?总不能将原始图片加载到内存中再进行缩放处 理吧,要知道在移动开发中,内存是相当宝贵的,一张100K的图片,加载完所占用的内存何止是100K。

经过阅读文档发现,Options中有个属性inJustDecodeBounds,文档中的是这么说的:

If set to true, the decoder will return null (no bitmap), but the out... fields will still be set, allowing the caller to query the bitmap without having to allocate the memory for its pixels.  意思就是说如果该值设为true那么将不返回实际的bitmap对象,不给其分配内存空间但是可以得到一些解码边界信息即图片大小等信 息。因此我们可以通过设置inJustDecodeBounds为true,获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值),就可以取图片了,这里要注意的是,inSampleSize 可能等于0,必须做判断。也就是说先将Options的属性inJustDecodeBounds设为true,先获取图片的基本大小信息数据(信息没有 保存在bitmap里面,而是保存在options里面),通过options.outHeight和 options. outWidth获取的大小信息以及自己想要到得图片大小计算出来缩放比例inSampleSize,然后紧接着将inJustDecodeBounds 设为false,就可以根据已经得到的缩放比例得到自己想要的图片缩放图了。

实现代码如下:

BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

// 记得把assets目录下的图片拷贝到SD卡中

// 由于设置inJustDecodeBounds为true,因此执行下面代码后bitmap为空

mBitmap = BitmapFactory.decodeFile("/sdcard/image.jpg", options);

// 计算缩放比例,由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可

int scale = (int) (options.outHeight / (float) 200);

// 因为结果为int型,如果相除后值为0.n,则最终结果将是0

if (scale <= 0)

{

scale = 1;

}

System.out.println("Scale=" + scale);

options.inSampleSize = scale;

options.inJustDecodeBounds = false;

// 重新读入图片,注意此时已经把options.inJustDecodeBounds设回false

mBitmap = BitmapFactory.decodeFile("/sdcard/image.jpg", options);

int width = mBitmap.getWidth();

int height = mBitmap.getHeight();

System.out.println(width + " " + height);

ImageView image = (ImageView) findViewById(R.id.image);

image.setImageBitmap(mBitmap);

这样我们就可以读取较大的图片而不会出现内存溢出问题了。

如果你想把压缩后的图片保存在sdcard上的话,通过如下代码就可以了:

File file = new File("/sdcard/ruoshui.png");

try

{

//记得添加sdcard读写权限

FileOutputStream out = new FileOutputStream(file);

if (mBitmap.compress(Bitmap.CompressFormat.PNG, 100, out))

{

out.flush();

out.close();

Toast.makeText(MainActivity.this, "保存成功!", Toast.LENGTH_LONG).show();

}

}catch (Exception e)

{

e.printStackTrace();

Toast.makeText(MainActivity.this, "保存失败!", Toast.LENGTH_LONG).show();

}

方法2:按长宽各自比例进行缩放

上面的方法缩放保存是按长宽比例的,我们当然也可以按固定大小进行缩放:

BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = false;

// 记得把assets目录下的图片拷贝到SD卡中

// 由于设置inJustDecodeBounds为true,因此执行下面代码后bitmap为空

mBitmap = BitmapFactory.decodeFile("/sdcard/image.jpg", options);

int bmpWidth = mBitmap.getWidth();

int bmpHeight = mBitmap.getHeight();

// 缩放图片的尺寸

float scaleWidth = (float) sWidth / bmpWidth; // 按固定大小缩放 sWidth 写多大就多大

float scaleHeight = (float) sHeight / bmpHeight; //

Matrix matrix = new Matrix();

matrix.postScale(scaleWidth, scaleHeight);// 产生缩放后的Bitmap对象

Bitmap resizeBitmap = Bitmap.createBitmap(mBitmap, 0, 0, bmpWidth, bmpHeight, matrix, false);

mBitmap.recycle();

ImageView image = (ImageView) findViewById(R.id.image);

image.setImageBitmap(resizeBitmap);

相关文章:

a标签是什么意思 怎么使用?

转自&#xff1a;https://www.imooc.com/qadetail/190881 (1) a标签的作用&#xff1a;超链接&#xff0c;用于跳转到别的网页。 (2) a标签的用法&#xff1a;<a href"网址" target"_blank" >到百度首页</a> 其中target是a标签的一个属性&…

【Java】Lucene检索引擎详解

基于Java的全文索引/检索引擎——Lucene Lucene不是一个完整的全文索引应用&#xff0c;而是是一个用Java写的全文索引引擎工具包&#xff0c;它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。 Lucene的作者&#xff1a;Lucene的贡献者Doug Cutting是一位资深全…

大手笔 !Julia Computing 获 2400 万美元融资,前 Snowflake CEO 加入董事会

整理 | 梦依丹出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;2021 年 7 月 19 日&#xff0c;由 Julia 高性能编程语言创始人成立的 Julia Computing 公司完成了 2400 万美元的 A 轮融资&#xff0c;这笔融资由 Dorilton Ventures 领投&#xff0c;Menlo Ventures…

(Mirage系列之六)在Mirage里使用Collection

在Mirage中&#xff0c;Collection是包含一个或多个CVD的集合。 Collection的主要作用是简化操作。比如我有一百个终端设备需要分配基础层&#xff0c;如果没有Collection&#xff0c;那么管理员需要逐个点击。这是无趣的重复劳动。有了Collection&#xff0c;只要选择一个Coll…

WAS服务器负载测试软件导读

转帖&#xff1a;出处未知 你的Web服务器和应用到底能够支持多少并发用户访问&#xff1f;在出现大量并发请求的情况下&#xff0c;软件会出现问题吗&#xff1f;这些问题靠通常的测试手段是无法解答的。本文介绍了Microsoft为这个目的而提供的免费工具WAS及其用法。另外&#…

深度学习实现场景字符识别模型|代码干货

作者|李秋键出品|AI科技大本营(ID:rgznai100)# 前言 #文字是人从日常交流中语音中演化出来&#xff0c;用来记录信息的重要工具。文字对于人类意义非凡&#xff0c;以中国为例&#xff0c;中国地大物博&#xff0c;各个地方的口音都不统一&#xff0c;但是人们使用同一套书写体…

SQL Server 一些重要视图3

1、 sys.dm_tran_locks; 为每一把锁返回一行、request_session_id 可以与sys.dm_tran_session_transactions \sys.dm_exec_connections相关联。 request_status 查看锁的分配情况 2、 sys.dm_os_waiting_tasks; 为每一个等待的任务返回一行、blocking_session_id标记是因为谁而…

Linux下将Mysql和Apache加入到系统服务里的方法

Apache加入到系统服务里面: cp /安装目录下/apache/bin/apachectl /etc/rc.d/init.d/httpd 修改httpd 在文件头部加入如下内容&#xff1a; ### # Comments to support chkconfig on RedHat Linux # chkconfig: 2345 90 90 # description:http server ### 保存 在打入 #chkconf…

int、bigint、smallint 和 tinyint

int、bigint、smallint 和 tinyint使用整数数据的精确数字数据类型。 bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据&#xff08;所有数字&#xff09;。存储大小为 8 个字节。 int 从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,6…

阿里技术文档:Redis+Spring全家桶+Dubbo精选+高性能+高并发

最近花了很长的时间去搜罗整理Java核心技术好文&#xff0c;我把每个Java核心技术的优选文章都整理成了一个又一个的文档。今天就把这些东西分享给老铁们&#xff0c;也能为老铁们省去不少麻烦&#xff0c;想学什么技能了&#xff0c;遇到哪方面的问题了 直接打开文档学一学就好…

SDN:软件定义网络

近期高级网络课的小组任务是在老师给定的范围内自选方向主题研究并做展示报告。我们组选了sdn。原以为这东西会是工业界无人问津的概念化产品&#xff0c;Google了一下却发现事实上sdn挺火的&#xff0c;因为它可能带来的可扩展性&#xff0c;一些大互联网企业也在開始涉足相关…

Linux之文本处理

1 cut&#xff1a;按某种方式对文件进行分割然后输出 选项&#xff1a;-b 按字节选取 -d 自定义分隔符 -f 和-d一起使用&#xff0c;指定哪个区域或字段 [rootlocalhost ~]# cat /etc/passwd | cut -d : -f 1 #以&#xff1a;为分隔符&#xff0c;打印第一个字段 […

Yahoo javascript 开源界面库YUI 和EXT

清清月儿整理 [yui][译]Yahoo!User Interface Libray 介绍 Yahoo! User Interface Library(简称yui) 是一个使用JavaScript编写的工具和控件库。它利用DOM脚本,DHTML和AJAX来构造具有丰富交互功能的Web程序。yui也包含几个核心的CSS文件。yui中的所有组件已经以开源的形式发布…

芯片开发语言:Verilog 在左,Chisel 在右

来源 | 老石谈芯在最近召开的RISC-V中国峰会上&#xff0c;中科院计算所的包云岗研究员团队正式发布了名为“香山”的开源高性能处RISC-V处理器。前不久我有幸和包老师就这个事情做了一次深度的交流&#xff0c;我们聊了关于RISC-V、还有“香山”处理器的前世今生。包老师也分享…

1.1GTK+ 的简单程序HelloWorld

1.1GTK 的简单程序HelloWorld 编译执行如图所看到的&#xff1a;

struts2 validate验证

转自&#xff1a;https://blog.csdn.net/houpengfei111/article/details/9038233 自定义拦截器 要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口&#xff1a; [java] view plaincopypublic class PermissionInterceptor implements Interceptor { …

PHP中文乱码

页面顶端加 <?php header("content-Type: text/html; charsetgbk"); ?>

收藏 | 提高数据处理效率的 Pandas 函数方法

作者&#xff1a;俊欣来源&#xff1a;关于数据分析与可视化前言大家好&#xff0c;这里是俊欣&#xff0c;今天和大家来分享几个Pandas方法可以有效地帮助我们在数据分析与数据清洗过程当中提高效率&#xff0c;加快工作的进程&#xff0c;希望大家看了之后会有收获。首先导入…

如何让两个div在同一行显示?一个float搞定

最近在学习div和css&#xff0c;遇到了一些问题也解决了很多以前以为很难搞定的问题。比如&#xff1a;如何让两个div显示在同一行呢&#xff1f;&#xff08;不是用table表格&#xff0c;table对SE不太友好&#xff09;其实&#xff0c;<div> 是一个块级元素&#xff0c…

使用sudo进入root权限,以及防止root密码被恶意篡改

一、前言 sudo是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具&#xff0c;减少了root用户的登陆和管理时间&#xff0c;提高了安全性。Sudo不是对shell的一个代替&#xff0c;它是面向每个命令的。 而防止root用户密码被恶意更改&#xff0c;主要是用户基本上…

赠书 | 干货!用 Python 动手学强化学习

01了解强化学习新闻报道中很少将强化学 习与机器学习、深度学习、人工智能这些关键词区分开来&#xff0c;所以我们要先介绍什么是强化学习&#xff0c;再讲解其基本机制。强化学习与机器学习、人工智能这些关键词之间的关系&#xff1b;强化学习相对于其他机器学习方法的优点和…

php如何调用c接口无错版

1.首先是要安装好PHP 2.进入PHP的下载解压目录下的ext目录 #cd /root/php-5.3.6/ext #./ext_skel --extnamehmc 说明&#xff1a; ./ext_skel --extnamemodule_name module_name是你自己可以选择的扩展模块的名字&#xff0c;例如我选择的hmc。执行工具后会自动在ext目录下建…

onchange事件只生效一次的问题

今天遇到一个file表单元素&#xff0c;对onchange事件的响应问题&#xff0c;发现仅响应一次&#xff0c;网上查到解决方法&#xff0c;在这里转载一下文件选择框的onchange事件只在第一次改变时生效&#xff0c;以后再选择文件不会触发onchange事件。解决方法1&#xff1a;用j…

WSFC2016 SMB多通道与网络调校

SMB多通道是微软Windows Server 2012时新增的一项功能&#xff0c;微软SMB3.0协议的一部分&#xff0c;主要用于SMB文件传输时&#xff0c;检测到多张可通信网卡&#xff0c;自动使用多张网卡进行传输&#xff0c;提高吞吐量&#xff0c;链路容错。 Windows Server 2012和之前的…

一个常用的正则表达验证类

这是 風語深蓝很早以前写的一个正则表达式验证工具类&#xff0c;包含了一些常见的校验和支持自定义的正则表达式匹配&#xff0c;可以选择完全匹配&#xff0c;也可以获取所有匹配项。曾用它仿造Eclispe下的正则表达式插件写过一个工具。因为最近突然有几个朋友都在问这方面的…

Signal和slot的声明和连接

信号(SIGNAL)和槽(SLOT)是Qt编程的一个重要部分。这个机制可以在对象之间彼此并不了解的情况下将它们的行为联系起来。Signal和slot的声明&#xff08;一&#xff09;在Qt程序设计中&#xff0c;凡是包含signal和slot的类中都要加上Q_OBJECT的定义&#xff0c;下面的例子给出了…

重磅!深度学习知识总结和调参技巧开放下载了

近年来&#xff0c;人工智能正在进入一个蓬勃发展的新时期&#xff0c;这主要得益于深度学习和CV领域近年来的发展和成就。在这其中&#xff0c;卷积神经网络的成功也带动了更多学术和商业应用的发展和进步。为了避免“内卷”&#xff0c;更多人选择学习进阶&#xff0c;但是仍…

Oracle优化器:星型转换

Oracle 8i中引入了星型转换(star transformation)的优化器新特性以便更有效地处理星型查询。星型查询语句多用于基于星型模型设计的数据仓库应用中。星型模型的称谓源于该种模型以图形化表现时看起来形似一颗海星。这颗星的中央会由一个或多个事实表(fact tables)组成&#xff…

php安装模式mod_php和Fastcgi的选择与对比

安装php又面临到了模式的选择&#xff0c;以前都是选择mod_php模式&#xff0c;因为这样安装比较方便哈&#xff0c;今天突然关心起FastCGI这种模式&#xff0c;败毒了一把&#xff0c;找到了一些关于mod_php和Fastcgi的选择与对比这方面的讨论&#xff0c;现在发出来留一个记号…

暴雨之后,评估与重建可以用这个数据集

作者&#xff1a;神经星星来源&#xff1a;HyperAI超神经场景描述&#xff1a;连续多日的暴雨给郑州和河南部分城市&#xff0c;带来了严重的洪涝灾害&#xff0c;牵动了全国人民的心。灾难面前&#xff0c;现阶段的科技和具体解决方案&#xff0c;也能发挥出关键作用。关键词&…