afkT/DevUtils

BitmapUtils 压缩有问题

lovemianhuatang opened this issue · 15 comments

/**
* 按质量压缩 ( 图片大小 )
* @param bitmap 待操作源图片
* @param maxByteSize 允许最大值字节数
* @return 质量压缩过的图片
*/
public static Bitmap compressByByteSize(final Bitmap bitmap, final long maxByteSize) {
return compressByByteSize(bitmap, Bitmap.CompressFormat.JPEG, maxByteSize, null);
}

/**
 * 按质量压缩 ( 图片大小 )
 * @param bitmap      待操作源图片
 * @param format      图片压缩格式
 * @param maxByteSize 允许最大值字节数
 * @return 质量压缩过的图片
 */
public static Bitmap compressByByteSize(final Bitmap bitmap, final Bitmap.CompressFormat format, final long maxByteSize) {
    return compressByByteSize(bitmap, format, maxByteSize, null);
}
afkT commented

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

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

afkT commented

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

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

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

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

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

afkT commented

需要这样使用

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

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

问题出在传入的 uri

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

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

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

image
这个我有做

afkT commented

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

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

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

三星G9280 安卓6.0.1

afkT commented

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

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

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

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

afkT commented

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

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

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

有了 谢谢

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

afkT commented

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

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