kotlin图片合成和压缩
kotlin图片合成和压缩
之前的方法是继承AsyncTask 在doInBackground 里面去做压缩的操作,然后用 publishProgress 切到主线程里面更新
新方法是在协程里的去做
class ImageService {private fun getSumWidths(bitmaps: ArrayList<Bitmap>): Int {var sumWidth = 0for (b in bitmaps) {sumWidth = intValidCheck((sumWidth + b.width).toLong())}return sumWidth}private fun getMaxHeights(bitmaps: ArrayList<Bitmap>): Int {var max = bitmaps[0].heightfor (bitmap in bitmaps) {if (max < bitmap.height) {max = bitmap.height}}return max}/*** crop front rear left right View Image*/fun cropImage(src: Bitmap): Bitmap {Log.d("cropImage src width: " + src.width + ", height: " + src.height)//int x, int y, int width, int heightval result =Bitmap.createBitmap(src, 0, 0, CROP_IMAGE_WIDTH_SIZE, CROP_IMAGE_HEIGHT_SIZE)Log.d("cropImage result width: " + result.width + ", height: " + result.height)if (result != src) {src.recycle()}return result}fun cropOtherViewImage(src: Bitmap): Bitmap? {Log.d("cropTopViewImage width: " + src.width + ", height: " + src.height)//int x, int y, int width, int heightval result = Bitmap.createBitmap(src,CROP_OTHER_VIEW_IMAGE_X_POINT,0,CROP_OTHER_VIEW_IMAGE_WIDTH_SIZE,CROP_OTHER_VIEW_IMAGE_HEIGHT_SIZE)Log.d("cropTopViewImage result width: " + result.width + ", height: " + result.height)if (result != src) {src.recycle()}return result}fun mergeMultipleImages(bitmaps: ArrayList<Bitmap>): Bitmap? {Log.d("mergeMultipleImages")if (bitmaps.isEmpty()){return null}var totalWidth = 0var maxHeight = 0for (bitmap in bitmaps) {totalWidth += bitmap.widthif (bitmap.height > maxHeight) {maxHeight = bitmap.height}}val mergedBitmap = Bitmap.createBitmap(getSumWidths(bitmaps),getMaxHeights(bitmaps),Bitmap.Config.ARGB_8888)val canvas = Canvas(mergedBitmap)val paint = Paint()/*val mTextPaint = Paint()mTextPaint.color = Color.WHITEmTextPaint.isAntiAlias = true*/var currentX = 0for (i in bitmaps.indices) {val bitmap = bitmaps[i]Log.d("bitmaps.get( " + i + " ) result width: " + bitmap.width + ", height: " + bitmap.height)val srcRect = Rect(0, 0, bitmap.width, bitmap.height)val dstRect = Rect(currentX, 0, currentX + bitmap.width, maxHeight)canvas.drawBitmap(bitmap, srcRect, dstRect, paint)currentX += bitmap.width}Log.d("mergeMultipleImages result Bitmap width: " + mergedBitmap.width + ", height: " + mergedBitmap.height)return mergedBitmap}suspend fun compressImages(bitmap: Bitmap): ByteArray? {return withContext(Dispatchers.Default) {Log.d(" start compressImages: ")val outputStream = ByteArrayOutputStream()var quality = 100bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream)while (outputStream.size() / KB > MAX_IMAGE_SIZE && quality > 0) {outputStream.reset()quality -= 1bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream)}Log.d("compressImages:end ${outputStream.size()}")val saveCompressImage = saveCompressImage(getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),outputStream)Log.d("saveCompressImage: $saveCompressImage")outputStream.toByteArray()}}private fun saveCompressImage(f: File, bos: ByteArrayOutputStream?): Boolean {val file = File(f,"compress.jpeg")Log.d("saveCompressImage : " + file.path)return try {val fos = FileOutputStream(file)bos?.writeTo(fos)Log.d("saveCompressImage success")fos.flush()fos.close()true} catch (e: Exception) {Log.d("saveCompressImage error")e.printStackTrace()false}}companion object {private const val MAX_IMAGE_SIZE = 250private const val CROP_IMAGE_WIDTH_SIZE = 120 // 尺寸要保持一致private const val CROP_IMAGE_HEIGHT_SIZE = 121 // 尺寸要保持一致private const val CROP_OTHER_VIEW_IMAGE_X_POINT = 1288 // 其他的尺寸要保持一致 这个是额外添加的viewprivate const val CROP_OTHER_VIEW_IMAGE_WIDTH_SIZE = 632 // 其他的尺寸要保持一致private const val CROP_OTHER_VIEW_IMAGE_HEIGHT_SIZE = 720 其他的尺寸private const val KB: Long = 1024fun intValidCheck(value: Long): Int {if (value < Int.MIN_VALUE || value > Int.MAX_VALUE) {throw ArithmeticException("Integer overflow")}return value.toInt()}}}
相关文章:
kotlin图片合成和压缩
kotlin图片合成和压缩 之前的方法是继承AsyncTask 在doInBackground 里面去做压缩的操作,然后用 publishProgress 切到主线程里面更新 新方法是在协程里的去做 class ImageService {private fun getSumWidths(bitmaps: ArrayList<Bitmap>): Int {var sumWid…...
Java学习笔记004——接口概念理解及意义
一个类中有抽象方法,则必须声明为abstract(做为抽象类),抽象类不能实例化。子类继承抽象类,必须对所有的抽象方法重写,否则依然有抽象方法,还是抽象的,无法实例化。故抽象类常做为基…...

MT笔试题
前言 某团硬件工程师的笔试题,个人感觉题目的价值还是很高的,分为选择题和编程题,选择题考的是嵌入式基础知识,编程题是两道算法题,一道为简单难度,一道为中等难度 目录 前言选择题编程题 选择题 C语言中变…...
50道SQL面试题
50道SQL面试题 有需要互关的小伙伴,关注一下,有关必回关,争取今年认证早日拿到博客专家 环境 -- ---------------------------- -- Table structure for teacher -- ---------------------------- DROP TABLE IF EXISTS teacher; CREATE TABLE teacher (t_id varchar(20) …...

2024蓝桥杯每日一题(双指针)
一、第一题:牛的学术圈 解题思路:双指针贪心 仔细思考可以知道,写一篇综述最多在原来的H指数的基础上1,所以基本方法可以是先求出原始的H指数,然后分类讨论怎么样提升H指数。 【Python程序代码】 n,l map(int,…...
Android 开发过程中常见的内存泄漏场景分析
场景1 Static变量存储上下文环境Context public class ClassName {// 定义1个静态变量private static Context mContext;//... // 引用的是Activity的contextmContext context; // 当Activity需销毁时,由于mContext 静态 & 生命周期 应用程序的生命周期&…...
Codeforces-1935E:Distance Learning Courses in MAC(思维)
E. Distance Learning Courses in MAC time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output The New Year has arrived in the Master’s Assistance Center, which means it’s time to introduce a new feature…...
ZooKeeper和Diamond有什么不同
本文主要是讨论下两个类似产品:ZooKeeper和Diamond在配置管理这个应用场景上的异同点。 Diamond,顾名思义,寄寓了开发人员对产品稳定性的厚望,希望它像钻石一样,提供稳定的配置访问。Diamond是淘宝网Java中间件团队的核…...
三、N元语法(N-gram)
为了弥补 One-Hot 独热编码的维度灾难和语义鸿沟以及 BOW 词袋模型丢失词序信息和稀疏性这些缺陷,将词表示成一个低维的实数向量,且相似的词的向量表示是相近的,可以用向量之间的距离来衡量相似度。 N-gram 统计语言模型是用来计算句子概率的…...
QML 3D入门知识路线
目前使用的版本 v5.14.0 模块导入 使用QML 3D时需要 import Qt3D.Core 2.14 核心模块类 V6以上的版本已经发布,所以有很多module会发生变化,主要有核心module、输入、逻辑、渲染、动画和扩展module,以及2D/3D场景模块 类名 能…...
蓝牙系列五:开源蓝牙协议BTStack框架代码阅读(1)
蓝牙学习系列,借鉴卫东上老师的蓝牙视频教程。 BTStack协议栈学习。首先来看一下,对于硬件操作,它是如何来进行处理的。在上篇文章中曾说过,在main函数里面它会调用硬件相关的代码,调用操作系统相关的代码。在BTStack中,可以搜索一下main.c,将会发现有很多main.c,都是…...
c++ 类内可以定义引用数据成员吗?
在C中,类内是可以定义引用数据成员的,但是在初始化对象时,必须在构造函数的成员初始化列表中对引用进行初始化,因为引用必须在创建时被初始化,并且不能在其生存期内引用不同的对象。下面是一个简单的示例: …...

MacBook2024苹果免费mac电脑清理垃圾软件CleanMyMac X
CleanMyMac X是一款专业的Mac清理软件,具备多种强大功能。首先,它能够智能清理Mac磁盘上的垃圾文件和多余语言安装包,从而快速释放电脑内存。其次,CleanMyMac X可以轻松管理和升级Mac上的应用,同时强力卸载恶意软件并修…...

Vue.js计算属性:实现数据驱动的利器
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

10-ARM gicv3/gicv4的总结-基础篇
目录 1、gic的版本2、GICv3/gicv4的模型图3、gic中断号的划分4、GIC连接方式5、gic的状态6、gic框架7、gic Configuring推荐 本文转自 周贺贺,baron,代码改变世界ctw,Arm精选, armv8/armv9,trustzone/tee,s…...

数据库系统概论(超详解!!!) 第三节 关系数据库
1.基本概念 1. 域(Domain) 域是一组具有相同数据类型的值的集合。 2. 笛卡尔积(Cartesian Product) 给定一组域D1,D2,…,Dn,允许其中某些域是相同的。 D1,D2…...

Springboot 集成kafka 消费者实现ssl方式连接监听消息实现消费
证书准备:springboot集成kafka 消费者实现 如何配置是ssl方式连接的时候需要进行证书的转换。原始的证书是pem, 或者csr方式 和key方式的时候需要转换,因为kafka里面是jks 需要通过openssl进行转换。 证书处理: KeyStore 用于存储客户端的证…...

spark 实验二 RDD编程初级实践
目录 一. pyspark交互式编程示例(学生选课成绩统计) 该系总共有多少学生; 该系DataBase课程共有多少人选修; 各门课程的平均分是多少; 使用累加器计算共有多少人选了DataBase这门课。 二.编写独立应用程序实现数…...

【MySQL】not in遇上null的坑
今天遇到一个问题: 1、当 in 内的字段包含 null 的时候,正常过滤; 2、当 not in 内的字段包含 null 的时候,不能正常过滤,即使满足条件,最终结果也为 空。 测试如下: select * from emp e;当…...

鸿蒙4.0-DevEco Studio界面工程
DevEco Studio界面工程 DevEco Studio 下载与第一个工程新建的第一个工程界面回到Project工程结构来看 DevEco Studio 下载与第一个工程 DevEco Studio 下载地址:点击跳转 https://developer.harmonyos.com/cn/develop/deveco-studio#download 学习课堂以及文档地址…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...

stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...