Android开发之Bitmap二次采样

Android-Bitmap压缩策略 在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。 阅读详情

1.为什么要二次采样

OK,那么首先我要 解决的一个问题就是为什么我们要二次采样?

不知道大家在开发App的过程中有没有遇到过类似于图片墙这样的功能?在做图片墙的时候你有没有遇到过OOM异常呢?遇到了又是怎么解决的?再比如我现在有一张100M大的图片,我想把这张图片用一个ImageView显示出来,那么你的ImageView能够显示出来这张图片吗?上面我们说的这两种情况其实都涉及到图片加载时内存溢出的问题,内存溢出可能发生在加载一张大图的时候,也有可能发生在加载多张普通小图的时候,如果我们不对图片做二次采样,那么OOM就是一把悬在头上的剑,随时可能会掉下。所以一定要对图片进行二次采样。事实上,我在手机上显示一张分辨率特别大的图片和显示一张分辨率小的图片(不要小的太离谱即可),对用户的视觉体验来说,并不会有多大变化,但是对我们手机的内存来说,影响却是非常巨大的。总而言之,二次采样就是为了避免图片加载时的OOM异常。

2.二次采样分别是哪两次?每次采样的目的是什么

既然是二次采样,那当然要分为两步了,下面我们来说说每次采样的主要工作:

1.第一次采样

第一次采样我主要是想要获得图片的压缩比例,假如说我有一张图片是200*200,那么我想把这张图片的缩略图显示在一个50*50的ImageView上,那我的压缩比例应该为4,那么这个4应该怎么样来获得呢?这就是我们第一步的操作了,我先加载图片的边界到内存中,这个加载操作并不会耗费多少内存,加载到内存之后,我就可以获得这张图片的宽高参数,然后根据图片的宽高,再结合控件的宽高计算出缩放比例。

2.第二次采样

在第一次采样的基础上,我来进行二次采样。二次采样的时候,我把第一次采样后算出来的结果作为一个参数传递给第BitmapFactory,这样在加载图片的时候系统就不会将整张图片加载进来了,而是只会加载该图片的一张缩略图进来,这样不仅提高了加载速率,而且也极大的节省了内存,而且对于用户来说,他也不会有视觉上的差异。

3.代码实现

说了这么多,我们来看看在Java代码中该怎么实现二次采样:

  1. public class BitmapUtils {  
  2.     /** 
  3.      * @param filePath   要加载的图片路径 
  4.      * @param destWidth  显示图片的控件宽度 
  5.      * @param destHeight 显示图片的控件的高度 
  6.      * @return 
  7.      */  
  8.     public static Bitmap getBitmap(String filePath, int destWidth, int destHeight) {  
  9.         //第一次采样  
  10.         BitmapFactory.Options options = new BitmapFactory.Options();  
  11.         //该属性设置为true只会加载图片的边框进来,并不会加载图片具体的像素点  
  12.         options.inJustDecodeBounds = true;  
  13.         //第一次加载图片,这时只会加载图片的边框进来,并不会加载图片中的像素点  
  14.         BitmapFactory.decodeFile(filePath, options);  
  15.         //获得原图的宽和高  
  16.         int outWidth = options.outWidth;  
  17.         int outHeight = options.outHeight;  
  18.         //定义缩放比例  
  19.         int sampleSize = 1;  
  20.         while (outHeight / sampleSize > destHeight || outWidth / sampleSize > destWidth) {  
  21.             //如果宽高的任意一方的缩放比例没有达到要求,都继续增大缩放比例  
  22.             //sampleSize应该为2的n次幂,如果给sampleSize设置的数字不是2的n次幂,那么系统会就近取值  
  23.             sampleSize *= 2;  
  24.         }  
  25.         /********************************************************************************************/  
  26.         //至此,第一次采样已经结束,我们已经成功的计算出了sampleSize的大小  
  27.         /********************************************************************************************/  
  28.         //二次采样开始  
  29.         //二次采样时我需要将图片加载出来显示,不能只加载图片的框架,因此inJustDecodeBounds属性要设置为false  
  30.         options.inJustDecodeBounds = false;  
  31.         //设置缩放比例  
  32.         options.inSampleSize = sampleSize;  
  33.         options.inPreferredConfig = Bitmap.Config.ARGB_8888;  
  34.         //加载图片并返回  
  35.         return BitmapFactory.decodeFile(filePath, options);  
  36.     }  
  37. } 

Unity中5分钟实现3D高斯泼溅渲染:从原理到实战部署 3D高斯泼溅(3D Gaussian Splatting)是一种新兴的神经渲染技术,它通过显式地使用大量3D高斯椭球来表示场景,革新了传统的体渲染和神经辐射场(NeRF)方法。其核心原理是将这些3D高斯投影到2D屏幕并进行快速光栅化与Alpha混合,从而绕过了耗时的光线步进,实现了极高的渲染效率。这项技术的价值在于,它能够在消费级GPU上达到实时甚至超实时的帧率,同时保持紧凑的数据表达和惊人的视觉细节,极大地降低了高质量3D重建与渲染的门槛。在应用场景上,它正快速渗透到数字孪生、虚拟现实、文化遗产数字化以及 阅读详情

相关推荐

Unity UI适配实战:从Canvas Scaler到主流游戏适配方案解析

本文深入解析Unity UI适配的核心技术,重点介绍Canvas Scaler组件的关键参数如Reference Resolution和Screen Match Mode,并提供主流游戏适配方案实战分析。通过九宫格拉伸、动态调整等技巧,帮助开发者解决多设备适配难题,提升游戏UI在不同分辨率下的表现。

weixin_29001419的博客 972

Android_Bitmap_图片的二次采样并生成缩略图

首先尝试通过字节数组或者流,只去加载图片的外边缘,此时必须指定BitmapFactory.Options 的inJustDecodeBounds成员名,将其只为true,一旦设置为true,BitmapFactory解码后返回值为null,通过Options的outHeight和outWidth可以获得图片的宽高。然后根据大小制定合适的缩放比例,通过options.inSampleSize,大大降

qjbagu的专栏 706

利用绝对式编码器实现电机无限旋转的配置与优化

本文详细解析了如何利用绝对式编码器实现电机的无限旋转功能。通过切换驱动器编码器工作模式、精确计算逻辑位置范围等关键配置步骤,解决了传统方案在多圈计数溢出时的定位难题。该方案无需硬件改造,适用于大型回转台、连续供料系统等需要大范围连续绝对定位的自动化场景。

weixin_29184371的博客 239

二次采样

1.  设置模拟器可读可写      并且在权限中添加可读权限 2.点击事件中         Bitmap bitMap = getBitMap(Environment.getExternalStorageDirectory() + "/aaa.jpg", 320, 480);         imageView.setImageBitmap(bitMap); 3.写方法

lxrlxr888的博客 950

CTF---Web---文件包含---01

文章目录前言一、题目描述二、解题步骤1.查看源代码2.文件包含(/etc/passwd)3.解码总结 前言 题目分类: CTF—Web—文件包含 一、题目描述 题目:提示寻找passwd文件 二、解题步骤 1.查看源代码 提示所有图片存储路径是download.php?name=img, 此时name参数的存在就提示此题可能为“文件包含”。 2.文件包含(/etc/passwd) 两种查看方式: 2.1、访问view-source:http://192.168.87.180/download.php

qq_22160557的博客 1391

Mac用户解决WPS中的俄语显示红线问题(WPS添加外语拼写检查)

我所使用的WPS版本:AppleStore 下载的 MacOs版 3.3.0 首先,对于 在访达-应用程序中,找到WPS,右键-点击“显示包内容” 然后按照下图的索引目录(Contents\Resource\office6\dicts\spellcheck),最后进入一个叫“spellcheck”的文件夹 最后将下载好的字典包(例如上图中的 en_US就代表美式英语;ru_RU就代表俄语) 关于字典包资源下载,我在网上找到一个Google云盘,里面包含了法语,德语,西语,意大利语,葡萄牙.

qq_48159150的博客 7897

二次采样工具类

package com.bawei.yuezkao1.model.http; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Environment; import android.os.Handler; import android.widget.ImageView; import java.io.BufferedInputStream; import java.io.File

QQ2731272317的博客 208

告别盲打:为NXOpen Python API生成智能代码提示的完整指南

本文提供了一份为NXOpen Python API生成智能代码提示的完整指南。通过配置匹配的Python环境、利用类型存根文件生成工具创建.pyi文件,并在PyCharm或VSCode中正确配置,开发者可以彻底告别“盲打”,获得精准的代码补全和参数提示,从而大幅提升NX二次开发的效率和体验。

weixin_29057695的博客 371

Android开发之Bitmap的二次采样

在讲之前我们先做一下铺垫: 首先介绍一下Bitmap的配置类Config 1、)A:ALPHA 透明度 R:Red 红色 G:Green绿 B:Blue 蓝 public enum Config { ALPHA_8 (1), RGB_565 (3), @Deprecated ARGB_4444 (4), ARGB_888...

昨夜听风雨的博客 314

Silvaco Atlas新手入门:从安装到第一个半导体器件仿真(附DeckBuild配置)

本文为Silvaco Atlas新手提供了一份从软件安装、DeckBuild环境配置到完成第一个半导体器件仿真的实战指南。通过构建一个经典的PN结二极管案例,详细讲解了Atlas仿真语句的语法、核心命令顺序以及结果调试与可视化方法,帮助初学者快速上手并理解TCAD仿真流程。

sql99的博客 332

用Python爬取大连商品交易所期货实时行情:从入门到实战

python复制编辑# utils.py"豆粕": "M0","铁矿石": "I0","聚乙烯": "L0","玉米": "C0","聚丙烯": "PP0","棕榈油": "P0"本项目展示了:✅ 如何从新浪财经 API获取主力合约实时数据✅ 使用Python异步爬虫技术) 提升效率✅ 利用pandas和matplotlib进行结构化分析与可视化✅ 具备良好的扩展性,可对接金融、农业、能源等数据需求场景✅ 可作为期货量化策略数据源✅ 可嵌入自动化报告系统。

2201_76125261的博客 1247

Bitmap二次采样

一、二次采样: (一)、意义或目的:    1、用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。BitmapFactory.decodeFile(imageFile); 2、BitmapFactory.Options.inSampleSize:设置恰当的inSampleSize可以使BitmapFa...

bobo的博客 124

YOLO系列算法改进 | C3k2改进篇 | 融合MambaOut轻量化门控架构 | 纯卷积实现超越Mamba性能的同时兼顾极致轻量化与边缘部署效率 | CVPR 2025

YOLO系列算法改进 | C3k2改进篇 | 融合MambaOut轻量化门控架构 | 纯卷积实现超越Mamba性能的同时兼顾极致轻量化与边缘部署效率 | CVPR 2025 (以YOLOv26最新目标检测模型为基础,利用C3k2_MambaOut创新模块进行改进)

2502_91881744的博客 224

Android26_Bitmap二次采样

Bitmap二次采样 一、二次采样: (一)、意义或目的:  1、用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。BitmapFactory.decodeFile(imageFile)(decodeResource); 2、BitmapFactory.Options.inSa

huohu1007的博客 339

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: Fragment与Activity生命周期的区别与认识
Developer_Sir
博客等级 码龄9年 3粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值