afkT / DevUtils

:fire: ( 持续更新,目前含 300+ 工具类 ) DevUtils 是一个 Android 工具库,主要根据不同功能模块,封装快捷使用的工具类及 API 方法调用。该项目尽可能的便于开发人员,快捷、高效开发安全可靠的项目。
Apache License 2.0
1.34k stars 302 forks source link

BitmapUtils 压缩有问题 #5

Closed lovemianhuatang closed 4 years ago

lovemianhuatang commented 4 years ago

/**

afkT commented 4 years ago

请问是压缩什么类型的图片(PNG 是无损的,不能进行压缩),需要实现什么功能,该方法是质量压缩,压缩后的 Bitmap 内存大小并不会减少

lovemianhuatang commented 4 years ago

截长图太大了 想控制在1M以下

afkT commented 4 years ago

如果你压缩后还需要显示,只能压缩宽高、以及设置 Bitmap.Config.RGB_565

如果你是需要保存的图片控制在指定的大小内,我可以提供一个方法获取一个最佳的压缩比例方法 (getQuality),通过传入大小值,搭配 ImageUtils.saveBitmapToSDCardJPEG(bitmap, filePath, quality) 使用

lovemianhuatang commented 4 years ago

点击截图需要在下一个页面显示 我是这样的 image

lovemianhuatang commented 4 years ago

PathUtils.getAppExternal().getAppPicturesPath() + DevCommonUtils.getRandomUUIDToString() + ".jpg";

图片存在这个位置 我用MediaStoreUtils的 MediaStoreUtils.insertImage(MediaStoreUtils.createImageUri(),uri); 刷新相册 发现在相册找不到 请问是路径的问题吗? 我需要保存在哪好些?

afkT commented 4 years ago

需要这样使用

这里需要 + 上 "/" (可加可不加,非该问题)

String path = PathUtils.getAppExternal().getAppPicturesPath() + "/" + DevCommonUtils.getRandomUUIDToString() + ".jpg"

问题出在传入的 uri

Uri uri = UriUtils.getUriForFile(new File(path));

MediaStoreUtils.insertImage(MediaStoreUtils.createImageUri(), uri);

因为内部存储分享出去,需要进行 FileProvider 操作

lovemianhuatang commented 4 years ago

image 这个我有做

afkT commented 4 years ago

你那个是什么手机、Android 版本

刚才那个压缩的,你最终需要在另外一个页面显示的话,只能进行缩放宽高、设置 Bitmap.Config.RGB_565、以及修改采样率来显示。

至于保存的话,我下个版本会提供一个传入指定大小值返回最佳的压缩比例的方法

lovemianhuatang commented 4 years ago

三星G9280 安卓6.0.1

afkT commented 4 years ago

有尝试过 MediaStoreUtils#insertImage(final String filePath, final String name, final boolean notify) 方法能够显示吗,在 Pictures 或 DCIM 有存储的那张图片不

lovemianhuatang commented 4 years ago

MediaStoreUtils.insertImage(MediaStoreUtils.createImageUri(),uri);

我用这个 Pictures目录下是有图片的 但相册没显示

MediaStoreUtils#insertImage(final String filePath, final String name, final boolean notify) 不行 Pictures 或 DCIM 没有文件

afkT commented 4 years ago

你这样,保存还是用 MediaStoreUtils.insertImage(MediaStoreUtils.createImageUri(),uri);

            Uri imageUri = MediaStoreUtils.createImageUri();
            MediaStoreUtils.insertImage(imageUri, uri);
            String filePath = UriUtils.getFilePathByUri(imageUri);
            MediaStoreUtils.notifyMediaStore(filePath);

看这样是否会刷新,通知相册

lovemianhuatang commented 4 years ago

有了 谢谢

lovemianhuatang commented 4 years ago

image 我这样能使bitmap 变小 有其他方法吗?

afkT commented 4 years ago

那个压缩的问题,保存指定大小内的话我已经新增方法了(calculateQuality 你可以直接复制这个代码搭配 saveBitmapToSDCardJPEG 使用)

如果你保存后需要显示的话,则需要使用 BitmapUtils#compressBySampleSize 或 compressByScale (缩小到与屏幕宽度相同的宽度)以及把 Bitmap 修改为 Bitmap.Config.RGB_565,减少内存占用大小