首页 > 其他分享 >基于清晰度优先的安卓图片压缩工具的二次开发小记。

基于清晰度优先的安卓图片压缩工具的二次开发小记。

时间:2024-03-05 19:24:59浏览次数:32  
标签:null 压缩工具 修复 安卓 bug 二次开发 笔者 data 压缩

原程序:https://github.com/lexluthors/CompressTools-Android

工具特性:

  1. 这是和微信压缩效果类似的压缩方式,采用底层压缩。
  2. 尽量无损压缩图片,保持清晰度最优。可以对比原生方法bitmap.compress(CompressFormat.JPEG, quality, fileOutputStream);
  3. 占用内存少,支持压缩生成原图分辨率图片
  4. 支持批量压缩,采用线程池提高性能
  5. 支持压缩监听回调
  6. 支持返回Bitmap和File 不支持x86架构

压缩情况对比:

ImageInfo compressTool Wechat
1.50MB (1920x1080) 47.32kb(1280*720) 51.4kb(1280*720)

微信压缩图片样例:

这个是采用该库压缩后的图片:

原程序段已介绍完毕。根据记录,原作者已于五年前停止更新了该项目,而最近一次大型更新为添加了批量压缩的功能。

笔者在阅读源代码与测试程序中发现,原作者编写的代码与程序存在以下问题。

  1. 在使用对象之前,未检查null引用,存在潜在的NullPointerException使得程序报错。
存在问题代码段
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
	{
		super.onActivityResult(requestCode, resultCode, data);
		if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK)
		{
			if (data == null)
			{
				showError("打开失败");
				return;
			}
			try
			{
				oldFile = getTempFile(this, data.getData());
				filePath = oldFile.getAbsolutePath();
				mainImageOld.setImageBitmap(BitmapFactory.decodeFile(oldFile.getAbsolutePath()));
				mainTextOld.setText(String.format("Size : %s", getReadableFileSize(oldFile.length())));
			}
			catch (IOException e)
			{
				showError("读图失败");
				e.printStackTrace();
			}
		}
	}
  1. 程序的错误处理逻辑在方法中一同处理,导致代码的可读性与维护性极低。
修改样例
private void handleOpenError() {
    showError("打开失败");
}

if (data != null && data.getData() != null) {
    //省略无用代码段
    ...原方法...
} else {
    handleOpenError();
}
  1. 未使用try-with-resources替代手动关闭流的方式,使得程序存在资源泄漏的可能性。
修改样例
try (InputStream inputStream = context.getContentResolver().openInputStream(uri);
     FileOutputStream out = new FileOutputStream(tempFile)) {
    if (inputStream != null) {
        copy(inputStream, out);
    }
} catch (IOException e) {
    e.printStackTrace();
}
  1. 存在大批量无用注释。

无用注释略过不表,有兴趣可以前往原作者github页面下载master文件查看

笔者通过以上几个角度对软件进行了维护修复的二次开发。

虽然对于软件的底层算法,笔者暂且没有能力进行维护,但是对于使用过程中存在的恶性bug笔者已经进行了修复。

在修复这个项目中恶性bug的过程中,笔者深刻体会到了以下三个方面的重要性。

  1. 首先,问题的定位和分析是整个修复过程的关键。深入理解bug的根本原因不仅仅是为了修复当前问题,更是为了增强对代码的理解和熟练度。这让笔者认识到在解决问题的过程中,深挖背后的原理是至关重要的。
  2. 其次,测试的重要性在这次修复中得到了再次印证。笔者发现全面而严谨的测试不仅仅是为了确认修复的bug,更是为了保证代码的整体质量。这也提醒笔者在未来的开发中,需要更注重测试,以及构建完善的测试体系。
  3. 最后,通过这次修复,笔者对于维护和改进代码的意识理解也更为深刻。理解代码的生命周期,以及对于长期维护的重要性,使得笔者在软件开发者的成长道路上变得更加有远见。

写在最后与展望:本项目开源于github,在修复这些恶性bug的过程中,笔者认为开源对于一个软件寿命的延续起到了至关重要的作用。即使这份软件原作者已在五年前停止更新,但由于开源的性质,也使得笔者有机会进行二次开发。笔者在之后更会对于软件的其他缺点进行开发,笔者认为软件的ui界面已经过时,对于Android设备的异型屏适配也不够完善。笔者之后将通过这两个角度对于软件进行进一步的更新,会同步于笔者的github与博客园进行发表供给阅读。

标签:null,压缩工具,修复,安卓,bug,二次开发,笔者,data,压缩
From: https://www.cnblogs.com/mistletoeann/p/18054691

相关文章

  • C++ 职工信息管理系统项目的二次开发 2252423 ywx
    来源:同学大二下的期末大作业:网上购书系统项目。运行环境:VisualStudio2022①项目结构:②运行结果截图:主菜单界面:功能选择界面:工资总额输出界面:平均工资输出界面:显示输出界面:增加正式员工界面:增加临时员工界面:修改数据界面:③主要问题:查询功能未完善,有时会出现......
  • 基于c/c++的公司职工管理系统软件的二次开发
    引言:经过在网络上的广泛搜索和比较,我了解了一款基于C/C++的公司职工管理系统软件,这款软件在基本功能方面表现相当完善,能够满足日常的使用需求。然而,在实际使用过程中,我也发现它存在一些问题和不足,所以我决定对该软件进行二次开发。原始代码:点击查看代码**main.cpp**#include......
  • 基于JAVA的2048小游戏的二次开发
    引言《2048Numberpuzzlegame》是一款数字益智游戏,而《2048》的初始数字则是由2+2组成的基数4。在操作方面的不同则表现为一步一格的移动,变成更为爽快的一次到底。相同数字的方框在靠拢、相撞时会相加。系统给予的数字方块不是2就是4,玩家要想办法在这小小的16格范围中凑出「2048」......
  • 基于JAVA的康威生命游戏二次开发
    引言:       康威生命游戏(Conway'sGameofLife)是一种基于细胞自动机的零玩家游戏,由数学家约翰·康威(JohnConway)于1970年创建。这个游戏并不是传统意义上的游戏,而是一种模拟生命演变的规则系统。康威生命游戏的“宇宙”是一个由无限的二维网格组成的平面,每个格子被称为......
  • JAVA项目 贪吃蛇游戏二次开发
    基于java实现贪吃蛇小游戏,主要通过绘制不同的图片并以一定速度一帧一帧地在窗体上进行展示。原代码地址:https://gitee.com/jay_musu/games-and-tools.gitpackagecom.snake.view;importjava.awt.Color;importjava.awt.EventQueue;importjava.awt.Font;importjava.awt......
  • 新版安卓edge无法播放部分视频的原因——没有发送referer
    概述 ......
  • C++游戏飞翔的小鸟软件二次开发
    引言:在快节奏的现代生活中,人们总是在寻找一种方式来放松自己,释放内心的压力。游戏作为一种娱乐方式,早已深入人心。今天,我要向大家介绍的是一款简单而又充满挑战的小游戏——飞翔的小鸟。这款游戏的核心玩法是控制一只小鸟在无尽的天空中飞翔,通过点击屏幕使小鸟上升,避开各种障碍......
  • C++网上购书系统项目的二次开发 2252416 hzx
    1、来源:同学大二下的期末大作业:网上购书系统项目。2、运行环境:VisualStudio2019代码:点击查看代码#include"StdAfx.h"#include<iostream>#include"person.h"#include<string.h>#include"globalfunction.h"#include"book.h"#include"adm.h&......
  • C语言“贪吃蛇”小游戏二次开发
    引言当谈到经典的电子游戏时,贪吃蛇(Snake)无疑是首选之一。贪吃蛇游戏以简单却具有挑战性的玩法深受玩家喜爱。在游戏中,玩家需要操控一条蛇在游戏界面上不断移动,吃掉食物并尽可能长大,同时避免撞到墙壁或者自己的身体。其简单却耐玩的特点使得贪吃蛇成为了许多人童年时的美好回忆。......
  • 安卓使用HttpCanary进行抓包
    IOS抓包软件Stream的安装与使用使用「Stream」进行IOS抓包同样的代码,有时候在安卓端会出现不同的问题,所以还需要进行安卓的抓包另外安卓非Root用户的抓包比较麻烦,需要安装指定版本的HttpCannary(小黄鸟)HttpCanary介绍1、观看抓包软件的結果还能抓取音频以及视频。2、可以自动式......