我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android图片采样缩放功能实例代码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android图片采样缩放功能实例代码

为什么要对Android中的图片进行采样缩放呢?

是为了更加高效的加载Bitmap。假设通过imageView来显示图片,很多时候ImageView并没有图片的原始尺寸那么大,这时候把整张图片加载进来后再设给ImageView是没有必要的,因为ImagView并没有办法显示原始的图片。

所以我们可以使用BitmapFactory.Options按照一定的采样率加载缩小后的图片,将缩小后的图片在ImageView中显示,这样就能降低内存占用,在一定程度上避免OOM,提高bitma加载时候的性能。

BitmapFactory有一个参数:inSampleSize(采样率)。

inSampleSize为1,那么采样后图片大小等于原始图片大小。

inSampleSize为2,那么采样后图片宽高均为原始图片的1/2,像素为原图的1/4,占有的内存大小为原图的1/4。

例如:一张的图片像素为1024*1024,储存格式为ARGB8888格式储存,那么它占有内存1024*1024*4=4M,用采样率为2采样后内存占用为512*512*4=1M。

总结:inSampleSize是必须大于1的整数才有效果,小与1就相当于1,并且同时作用于宽高,所以缩放后的图片大小以采样率的2次方形式递减.根据最新的官方文档,inSampleSize的取值应该总是为2的指数,若给系统的inSampleSize不为2的指数,那么系统会向下取整并且选择一个最接近2的指数来代替,不过经过验证,这个结论并不是在所有的Android版本上都成立。

 那么我们如何获取采样率呢?

将BitmapFactory.Option的inJustDecodeBound参数设为true,加载图片,这个时候图片并没有加载进内存,仅仅是去解析图片原始宽高信息而已。

从BitmapFactory.Option取出图片的原始宽高信息,对应于outWidth,outHeight参数。

根据采样率的规则和目标原始View的所需大小计算出采样率inSampleSize。

将BitmapFactory.Option的inJustDecodeBound参数设为false,重新加载图片,这时候图片才真正被载进内存。

以下提供一份代码模板:package com.example.chatting.chatting.utils;

import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.BitmapFactory.Options;import android.util.DisplayMetrics;import android.view.ViewGroup.LayoutParams;import android.widget.ImageView;public class ImagesTool {    public static Bitmap decodeSampledBitmapFromPath(String path,ImageView imageView)  {    Options options = new Options();    options.inJustDecodeBounds=true;    BitmapFactory.decodeFile(path,options);    ImageSize imageSize=getImageViewSize(imageView); //获取图片大小,ImageSize是封装着ImageView大小的类    //计算采样率    options.inSampleSize=caculateInSampleSize(options,imageSize.width,imageSize.height);    options.inJustDecodeBounds=false;    Bitmap bitmap=BitmapFactory.decodeFile(path, options);    return bitmap;  }  //计算采样率  public static int caculateInSampleSize(Options options,ImageView imageView)  {    ImageSize imageSize=getImageViewSize(imageView);    int inSampleSize=caculateInSampleSize(options, imageSize.width,imageSize.height);    return inSampleSize;  }    public static Bitmap decodeSampledBitmapFromPath(String path,int reqWidth, int reqHeight)  {    Options options = new Options();    options.inJustDecodeBounds=true;    BitmapFactory.decodeFile(path,options);    //计算采样率    options.inSampleSize=caculateInSampleSize(options,reqWidth,reqHeight);    options.inJustDecodeBounds=false;    Bitmap bitmap=BitmapFactory.decodeFile(path, options);    return bitmap;  }  //计算采样率  private static int caculateInSampleSize(Options options, int reqWidth, int reqHeight)   {    int width=options.outWidth; //原始图片宽    int height=options.outHeight; //原始图片高    int inSampleSize=1; //采样率    if(width>reqWidth || height>reqHeight) //原始的宽比目标宽大,或者原始高比目标高大    {      int widthRadio=Math.round(width *1.0f/reqWidth);      int heightRadio = Math.round(height * 1.0f / reqHeight);      inSampleSize = Math.max(widthRadio, heightRadio);    }    return inSampleSize;  }  //获取ImageView的大小  protected static ImageSize getImageViewSize(ImageView imageView)   {    ImageSize imageSize = new ImageSize();    DisplayMetrics metrics = imageView.getContext().getResources().getDisplayMetrics();    LayoutParams lp = imageView.getLayoutParams();    int width = imageView.getWidth();    if (width <= 0) {      width = lp.width;    }    if (width <= 0) {      width = imageView.getMaxWidth();    }    if (width <= 0) {      width = metrics.widthPixels;    }    int height = imageView.getHeight();    if (height <= 0) {      height = lp.height;    }    if (height <= 0) {      height = imageView.getMaxHeight();    }    if (height <= 0) {      height = metrics.heightPixels;    }    imageSize.width = width;    imageSize.height = height;    return imageSize;  }  //ImageView大小的封装类  private static class ImageSize  {    int width;    int height;  }}

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android图片采样缩放功能实例代码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android图片采样缩放功能实例代码

为什么要对Android中的图片进行采样缩放呢?是为了更加高效的加载Bitmap。假设通过imageView来显示图片,很多时候ImageView并没有图片的原始尺寸那么大,这时候把整张图片加载进来后再设给ImageView是没有必要的,因
2023-05-30

android 图片操作(缩放移动) 实例代码

view_show.xml代码如下:2022-06-06

Android中imageView图片放大缩小及旋转功能示例代码

一、简介二、方法1)设置图片放大缩小效果第一步:将标签中的android:scaleType设置为"fitCenter"android:scaleType="fitCenter"
2023-05-30

Android 图片缩放实例详解

本文实现Android中的图片的缩放效果 首先设计布局:2022-06-06

Android实现多点触控,自由缩放图片的实例代码

Android多点触控涉及到的知识点 1、ScaleGestureDetector 2、OnScaleGestureListener 3、Matrix 4、OnTouchListener 四个知识点需要了解一下,需要注意的是Matrix在内
2022-06-06

Android编程实现图片放大缩小功能ZoomControls控件用法实例

本文实例讲述了Android编程实现图片放大缩小功能ZoomControls控件用法。分享给大家供大家参考,具体如下:MainActivity代码:package example.com.myapplication;import andro
2023-05-30

Android图片实现压缩处理的实例代码

整理文档,搜刮出一个Android图片实现压缩处理的实例代码,稍微整理精简一下做下分享。详解:1.获取本地图片File文件 获取BitmapFactory.Options对象 计算原始图片 目标图片宽高比 计算输出的图片宽高2.根据宽高比计
2023-05-30

Android图片裁剪功能实现代码

在Android应用中,图片裁剪也是一个经常用到的功能。Android系统中可以用隐式意图调用系统应用进行裁剪,但是这样做在不同的手机可能表现出不同的效果,甚至在某些奇葩手机上还会出其他更奇怪的问题,所以调用系统功能进行图片裁剪在很多时候对
2022-06-06

Android App中实现可以双击放大和缩小图片功能的实例

先来看一个很简单的核心图片缩放方法:public static Bitmap scale(Bitmap bitmap, float scaleWidth, float scaleHeight) { int width = bitmap.ge
2022-06-06

Android单点触控实现图片平移、缩放、旋转功能

相信大家使用多点对图片进行缩放,平移的操作很熟悉了,大部分大图的浏览都具有此功能,有些app还可以对图片进行旋转操作,QQ的大图浏览就可以对图片进行旋转操作,大家都知道对图片进行缩放,平移,旋转等操作可以使用Matrix来实现,Matrix
2022-06-06

基于RxPaparazzo实现图片裁剪、图片旋转、比例放大缩小功能

前言:基于RxPaparazzo的图片裁剪,图片旋转、比例放大|缩小。效果: 开发环境:AndroidStudio2.2.1+gradle-2.14.1 涉及知识:1.Material Design(CardView+Coordinator
2023-05-31

android 简单图片动画播放的实例代码

xml中: 代码如下:
2022-06-06

Vue后台实现点击图片放大功能的示例代码

这篇文章主要为大家详细介绍了如何利用Vue实现点击图片放大功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
2022-12-08

如何在Android中利用imageview实现一个图片缩放功能

如何在Android中利用imageview实现一个图片缩放功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Android 自定义imageview实现图片缩放实例详解 觉得
2023-05-31

Android应用中怎么实现一个图片预览缩放功能

Android应用中怎么实现一个图片预览缩放功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体实现方法如下2023-05-31

Android中怎么实现图片压缩功能

Android中怎么实现图片压缩功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、图片质量压缩/** * 质量压缩方法 * @param image
2023-05-31

Swift如何实现缩放并填充图片功能

小编给大家分享一下Swift如何实现缩放并填充图片功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实现先看代码,然后再分析:func rescaleAndPad
2023-06-25

如何用js实现手指缩放图片功能

这篇“如何用js实现手指缩放图片功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何用js实现手指缩放图片功能”文章吧。需
2023-06-26

Android 自定义imageview实现图片缩放实例详解

Android 自定义imageview实现图片缩放实例详解 觉得这个自定义的imageview很好用 性能不错 所以拿出来分享给大家 因为不会做gif图 所以项目效果 就不好贴出来了 把代码贴出来 1.项目结构图2.Compat
2022-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录