【问题标题】:Storing Bitmap in SD card loosing the image quality将位图存储在 SD 卡中会降低图像质量
【发布时间】:2014-01-11 12:03:20
【问题描述】:

我将位图存储在 SD 卡中,同时检索失去其质量。我该如何解决这个问题。下面是我将位图存储在 SD 卡中的代码。

public void saveExternalPrivateStorage(File folderDir, String fname,
        Bitmap bitmap) {

    File file = new File(folderDir, fname);

    if (file.exists()) {
        file.delete();
    }
    if ((folderDir.mkdirs() || folderDir.isDirectory())) {
        try {
            FileOutputStream out = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 0, out);
            out.flush();
            out.close();
            System.out.println("Stored");
            System.out.println(file.getAbsolutePath());
            System.out.println("Stored");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

调用此方法:

File folderDir= new File(getActivity().getExternalFilesDir("myfolder"),"/images");
storeImagesIndevices.saveExternalPrivateStorage(folderDir,filename,imgBitmapUrls.get(i));

从 SD 卡中检索:

Bitmap bitmap2 = BitmapFactory.decodeFile(folderDir+"/"+data.getTid());
        dbimgBitmapUrls.put(data.get_tid()-1, bitmap2);

非常感谢...

【问题讨论】:

    标签: java android bitmap image-quality


    【解决方案1】:
    bitmap.compress(Bitmap.CompressFormat.JPEG, 0, out);
    

    JPEG 是一种有损压缩格式,您已将 0% 设置为质量参数。 70% 左右通常是文件大小和图像质量之间的良好折衷:

    bitmap.compress(Bitmap.CompressFormat.JPEG, 70, out);
    

    或者使用无损格式,例如PNG,其中质量参数无关紧要:

    bitmap.compress(Bitmap.CompressFormat.PNG, 0, out);
    

    可以在 SQLite 中存储位图吗?这是好方法吗?在我的情况下,图像数量并不多

    你可以,但你不应该。更好的方法是将图像存储为文件,并将路径存储在数据库中。

    【讨论】:

    • 可以在SQLite中存储位图吗?这是好方法吗?在我的情况下,图像数量并不多。 @laalto
    • 你能推荐我吗??
    【解决方案2】:

    您应该使用更高的压缩质量:

     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
    

    compress 的第二个参数是一个 0-100 的数字,它标志着质量和文件大小之间的权衡:

    • 0 = 文件最小,质量最差
    • 100 = 文件最大,质量最好

    您可能会想要一个中间值,只需尝试一下,直到为您的应用程序找到一个令人满意的值。另请参阅compress() javadoc

    如果是这种情况,您也可以使用无损格式(如 PNG)而不是 JPEG。

    【讨论】:

    • 可以在SQLite中存储位图吗?这是好方法吗?在我的情况下,图像数量并不多。 @Stefano Sanfilippo
    • @user3154663 存储在 SQLite 中不会改变质量损失问题,它就像保存在另一个文件夹中一样。此外,仅将 SQLite 私有 DB 用于配置、历史记录等。除非您有非常特殊的需求,否则用户媒体应保持对用户的访问权限,/sdcard
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 2013-08-17
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2019-08-23
    • 2017-08-03
    相关资源
    最近更新 更多