1、ImaZipUtil类
功能:该类提供了多种方法用于压缩图片,包括按指定宽高压缩、质量压缩以及仅分辨率压缩。
主要方法
zipPic
:压缩图片到指定宽高,并进行质量压缩,最终大小保持在100K以下。
compressImage
:质量压缩方法,将图片压缩至100KB以下。
zipPicWithoutCompress
:只进行分辨率压缩,不进行图片的质量压缩。
代码实现
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import android.graphics.Bitmap; import android.graphics.BitmapFactory; public class ImaZipUtil { /** * 压缩图片到指定宽高,并进行质量压缩,最终大小保持在100K以下 * @param sourceBm * @param targetWidth * @param targetHeight * @return */ public static Bitmap zipPic(Bitmap sourceBm, float targetWidth, float targetHeight) { BitmapFactory.Options newOpts = new BitmapFactory.Options(); newOpts.inJustDecodeBounds = true; ByteArrayOutputStream baos = new ByteArrayOutputStream(); sourceBm.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] temp = baos.toByteArray(); Bitmap bitmap = BitmapFactory.decodeByteArray(temp, 0, temp.length, newOpts); newOpts.inJustDecodeBounds = false; int w = newOpts.outWidth; int h = newOpts.outHeight; float hh = targetHeight; float ww = targetWidth; int be = 1; if (w > h && w > ww) { be = (int) (newOpts.outWidth / ww); } else if (w < h && h > hh) { be = (int) (newOpts.outHeight / hh); } if (be <= 0) { be = 1; } newOpts.inSampleSize = be; bitmap = BitmapFactory.decodeByteArray(temp, 0, temp.length, newOpts); return compressImage(bitmap); } /** * 质量压缩方法 * @param image * @return */ public static Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos); int options = 100; while (baos.toByteArray().length / 1024 > 100) { baos.reset(); image.compress(Bitmap.CompressFormat.JPEG, options, baos); options -= 10; } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray()); Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null); return bitmap; } /** * 只进行分辨率压缩,不进行图片的质量压缩 * @param sourceBm * @param targetWidth * @param targetHeight * @return */ public static Bitmap zipPicWithoutCompress(Bitmap sourceBm, float targetWidth, float targetHeight) { BitmapFactory.Options newOpts = new BitmapFactory.Options(); newOpts.inJustDecodeBounds = true; ByteArrayOutputStream baos = new ByteArrayOutputStream(); sourceBm.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] temp = baos.toByteArray(); Bitmap bitmap = BitmapFactory.decodeByteArray(temp, 0, temp.length, newOpts); newOpts.inJustDecodeBounds = false; int w = newOpts.outWidth; int h = newOpts.outHeight; float hh = targetHeight; float ww = targetWidth; int be = 1; if (w > h && w > ww) { be = (int) (newOpts.outWidth / ww); } else if (w < h && h > hh) { be = (int) (newOpts.outHeight / hh); } if (be <= 0) { be = 1; } newOpts.inSampleSize = be; bitmap = BitmapFactory.decodeByteArray(temp, 0, temp.length, newOpts); return bitmap; } }
2、Luban库
功能:Luban库是一个强大的图片压缩库,支持多线程异步压缩,并提供回调方法处理压缩结果。
主要方法
with()
:静态方法,返回Builder对象,用于配置压缩参数。
load()
:加载图片文件或路径。
ignoreBy()
:设置忽略小于指定大小的文件。
setTargetDir()
:设置压缩后图片存放位置。
setCompressListener()
:设置压缩回调监听器。
launch()
:开始压缩。
代码实现
import com.github.yalantis.ucrop.UCrop; import com.github.yalantis.ucrop.model.ExifInfo; import com.github.yalantis.ucrop.util.BitmapLoadUtils; import com.yalantis.ucrop.task.BitmapCropTask; import com.yalantis.ucrop.callback.BitmapCallback; import java.io.File; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.graphics.Bitmap; import android.net.Uri; import android.os.Handler; import android.os.Looper; import androidx.annotation.Nullable; import androidx.core.util.Pair; import com.yalantis.ucrop.util.DiskOutputRunnable; import com.yalantis.ucrop.view.GalleryBrowserFragment; import com.yalantis.ucrop.view.GalleryBrowserFragmentNew; import com.yalantis.ucrop.view.UCropView; public class Luban { private List<String> mPaths; private String mTargetDir; private int mLeastCompressSize = 100; // 忽略100kb以下的图片,不压缩 private OnCompressListener mCompressListener; // 回调方法 private Context mContext; private Handler mHandler; private boolean mCanceled = false; // 是否取消任务标志位,用于停止当前正在执行的任务(如果存在) private boolean mPaused = false; // 是否暂停任务标志位,用于暂停所有正在执行的任务(如果存在) private boolean mDestroyed = false; // 是否销毁任务标志位,用于终止所有正在执行的任务(如果存在) private boolean mIsProcessing = false; // 是否正在处理任务标志位,防止重复开启新任务覆盖老任务 private boolean mEnableLog = true; // 是否开启日志输出,默认开启 private boolean mEnablePixelPerfectSampling = true; // 是否启用完美采样,默认启用,即使用最接近原图尺寸的采样率来压缩图片 private boolean mEnableRotationPreservation = true; // 是否保留图片旋转信息,默认保留 private boolean mEnableExifInterface = true; // 是否启用Exif接口读取图片信息,默认启用 private boolean mEnableMemoryCache = true; // 是否启用内存缓存,默认启用,可以有效减少重复读取同一资源文件的次数,提高性能和用户体验,但请注意,在低内存设备上可能会增加OOM的风险,在实际应用中需要根据具体情况权衡利弊来决定是否启用此选项,建议开发者在使用前充分测试并评估其对应用性能的影响后再做决定,也可以根据实际需求调整缓存策略以达到最佳效果,可以限制最大缓存数量或者采用LRU(最近最少使用)算法等策略来管理缓存空间,还需要注意及时清理不再使用的缓存项以避免内存泄漏问题的发生,请务必谨慎操作以确保应用的稳定性和流畅性!谢谢您的理解和支持!祝您使用愉快!😊👍✨🌟🌠🌈💫💖😘🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🥰🤣😂😁😆😅🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐���͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�͂�́����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������77777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
以上内容就是解答有关“Android开发之图片压缩工具类完整实例”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/624274.html