Android中的图片处理

本文介绍了一种图片压缩的方法,通过计算合适的压缩比例来减少内存占用,同时保持图片质量。此外,还详细阐述了一个结合强引用和软引用的图片缓存方案,以提高应用程序的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图片处理涉及的类:

BitMap:

Factory:

BitMapFactory.Option:

BitMap.Config:


图片压缩(大图片加载):

处理思路:

1.获取图片的像素宽高(不加载图片至内存中,所以不会占用资源)

2.计算需要压缩的比例

3.按将图片用计算出的比例压缩,并加载至内存中使用


涉及方法:

/**

* 获取压缩后的图片

* @param res

* @param resId

* @param reqWidth            所需图片压缩尺寸最小宽度

* @param reqHeight           所需图片压缩尺寸最小高度

* @return

*/

public static BitmapdecodeSampledBitmapFromResource(Resources res, int resId,

        int reqWidth, int reqHeight) {

  

    // 首先不加载图片,仅获取图片尺寸

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

    // 当inJustDecodeBounds设为true时,不会加载图片仅获取图片尺寸信息

    options.inJustDecodeBounds = true;

    // 此时仅会将图片信息会保存至options对象内,decode方法不会返回bitmap对象

    BitmapFactory.decodeResource(res, resId, options);

 

    // 计算压缩比例,如inSampleSize=4时,图片会压缩成原图的1/4

    options.inSampleSize =calculateInSampleSize(options, reqWidth, reqHeight);

 

    // 当inJustDecodeBounds设为false时,BitmapFactory.decode...就会返回图片对象了

    options. inJustDecodeBounds = false;

    // 利用计算的比例值获取压缩后的图片对象

    return BitmapFactory.decodeResource(res, resId, options);

}

/**

* 计算压缩比例值

* @param options       解析图片的配置信息

* @param reqWidth            所需图片压缩尺寸最小宽度

* @param reqHeight           所需图片压缩尺寸最小高度

* @return

*/

public static intcalculateInSampleSize(BitmapFactory.Options options,

             int reqWidth, int reqHeight) {

       // 保存图片原宽高值

       final int height = options. outHeight;

       final int width = options. outWidth;

       // 初始化压缩比例为1

       int inSampleSize = 1;

 

       // 当图片宽高值任何一个大于所需压缩图片宽高值时,进入循环计算系统

       if (height > reqHeight || width > reqWidth) {

 

             final int halfHeight = height / 2;

             final int halfWidth = width / 2;

 

             // 压缩比例值每次循环两倍增加,

             // 直到原图宽高值的一半除以压缩值后都~大于所需宽高值为止

             while ((halfHeight / inSampleSize) >= reqHeight

                        && (halfWidth / inSampleSize) >= reqWidth) {

                  inSampleSize *= 2;

            }

      }

 

       return inSampleSize;

}

图片加载:

1)图片加载顺序:

内存(强引用,软引用)->文件(sdcard)->网络




2)三级缓存:

内存(强引用+弱引用)+SdCard

重点是内存缓存:

思路:强引用+软引用, 强引用保存常用图片,软应用保存其他图片~

强引用因为不会自动释放对象,所以大小要进行一定限定,否则图片过多会异常, 比如控制里面只存放10张图片或者4M的图片;

然后每次往里面添加图片的时候,检查如果数量超过10张这个阀值,临界点值时,

就移除强引用里面最不常用的那个图片,移除的时候将其保存至软应用缓存池中~

final int MAX_CAPACITY = 10; // 一级缓存阈值

HashMap<String, SoftReference<Bitmap>> mSecondLevelCache = new HashMap<String,SoftReference<Bitmap>>();

// 第一个参数是初始化大小

// 第二个参数0.75是加载因子为经验值

// 第三个参数true则表示按照最近访问量的高低排序,false则表示按照插入顺序排序

HashMap<String, Bitmap>mFirstLevelCache = new LinkedHashMap<String, Bitmap>(

        MAX_CAPACITY / 2, 0.75f, true) {

     // eldest 最老的对象,即移除的最不常用图片对象

     // 返回值 true即移除该对象,false则是不移除

    protected booleanremoveEldestEntry(Entry<String, Bitmap> eldest) {

        if (size() > MAX_CAPACITY) {// 当缓存池总大小超过阈值的时候,将老的值从一级缓存搬到二级缓存

            mSecondLevelCache.put(eldest.getKey(),

                    new SoftReference<Bitmap>(eldest.getValue()));

            return true;

        }

        return false;

    }

};  




内容概要:本文系统介绍了基于C#(VS2022+.NET Core)与HALCON 24.11的工业视觉测量拟合技术,涵盖边缘提取、几何拟合、精度优化及工业部署全流程。文中详细解析了亚像素边缘提取、Tukey抗噪算法、SVD平面拟合等核心技术,并提供了汽车零件孔径测量、PCB焊点共面性检测等典型应用场景的完整代码示例。通过GPU加速、EtherCAT同步等优化策略,实现了±0.01mm级测量精度,满足ISO 1101标准。此外,文章还探讨了深度学习、量子启发式算法等前沿技术的应用前景。 适合人群:具备一定编程基础,尤其是熟悉C#和HALCON的工程师或研究人员,以及从事工业视觉测量与自动化检测领域的技术人员。 使用场景及目标:①学习如何使用C#和HALCON实现高精度工业视觉测量系统的开发;②掌握边缘提取、抗差拟合、3D点云处理等核心技术的具体实现方法;③了解工业部署中的关键技术,如GPU加速、EtherCAT同步控制、实时数据看板等;④探索基于深度学习和量子计算的前沿技术在工业视觉中的应用。 其他说明:本文不仅提供了详细的理论分析和技术实现,还附有完整的代码示例和实验数据,帮助读者更好地理解和实践。同时,文中提到的硬件选型、校准方法、精度验证等内容,为实际项目实施提供了重要参考。文章最后还给出了未来的技术演进方向和开发者行动建议,如量子-经典混合计算、自监督学习等,以及参与HALCON官方认证和开源社区的建议。
内容概要:本文介绍了基于WOA-GRU-Attention模型的时序数据分类预测项目,旨在提升时序数据分类准确率,实现智能优化,并提供强泛化能力的分类框架。项目背景指出传统机器学习方法难以处理时序数据的复杂特性,而GRU、注意力机制和WOA的结合能有效应对这些问题。文章详细描述了项目的目标与意义,包括提升分类准确率、实现智能优化、推动元启发式算法的应用等。同时,文中列出了项目面临的挑战及解决方案,如高维数据特征复杂、超参数调优难度等。项目模型架构由WOA、GRU和注意力机制三部分组成,通过Python代码示例展示了模型的具体实现,包括模型定义、训练过程和WOA优化算法的核心步骤。; 适合人群:具备一定编程基础,尤其是对深度学习、时序数据分析感兴趣的开发者和研究人员。; 使用场景及目标:① 提升时序数据分类准确率,特别是在金融、医疗、智能制造等领域;② 实现模型训练过程的智能优化,避免传统调参的局限;③ 提供具备强泛化能力的时序数据分类框架,支持多行业多场景应用;④ 推动高性能时序模型的工业应用落地,提高智能系统的响应速度和决策质量。; 其他说明:项目不仅实现了工程应用,还在理论层面对GRU结构与注意力机制的融合进行了系统分析,结合WOA优化过程对模型训练动力学展开研究,促进了深度学习与优化算法交叉研究领域的发展。读者可以通过提供的代码示例和链接进一步了解项目的具体实现和应用场景。
内容概要:本文详细介绍了如何使用PyQt5创建一个功能全面的桌面备忘录应用程序,涵盖从环境准备、数据库设计、界面设计到主程序结构及高级功能实现的全过程。首先,介绍了所需安装的Python库,包括PyQt5、sqlite3等。接着,详细描述了SQLite数据库的设计,创建任务表和类别表,并插入默认类别。然后,使用Qt Designer设计UI界面,包括主窗口、任务列表、工具栏、过滤器和日历控件等。主程序结构部分,展示了如何初始化UI、加载数据库数据、显示任务列表以及连接信号与槽。任务管理功能方面,实现了添加、编辑、删除、标记完成等操作。高级功能包括类别管理、数据导入导出、优先级视觉标识、到期日提醒、状态管理和智能筛选等。最后,提供了应用启动与主函数的代码,并展望了扩展方向,如多用户支持、云同步、提醒通知等。 适合人群:零基础或初学者,对Python和桌面应用程序开发感兴趣的开发者。 使用场景及目标:①学习PyQt5的基本使用方法,包括界面设计、信号与槽机制;②掌握SQLite数据库的基本操作,如创建表、插入数据、查询等;③实现一个完整的桌面应用程序,具备增删改查和数据持久化功能;④了解如何为应用程序添加高级特性,如类别管理、数据导入导出、到期日提醒等。 阅读建议:此资源不仅适用于零基础的学习者,也适合有一定编程经验的开发者深入理解PyQt5的应用开发。建议读者跟随教程逐步实践,结合实际操作来理解和掌握每个步骤,同时可以尝试实现扩展功能,进一步提升自己的开发技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值