将图像保存到内部存储器的更快方法

时间:2018-07-10 09:44:14

标签: java android performance

我的应用程序在加载时将一些图像保存在内部存储中。 问题在于应用程序在这种情况下使用的是最通用的代码,即在保存图像之前先对其进行压缩,但是此压缩过程需要很长时间才能处理。例如,如果要加载5张图片,则该应用程序大约需要30秒才能加载并打开主屏幕。 30秒太长,无法打开应用程序。 我保存图像的代码如下:

public static final boolean savePngLocalStorage(String fileName, Bitmap bitmap, Context context) throws IOException {
    BufferedOutputStream bos = null;
    Bitmap tmp = null;
    try {
        bos = new BufferedOutputStream(context.openFileOutput(fileName, Context.MODE_PRIVATE)); //他アプリアクセス不可
        tmp = bitmap.copy(Config.ARGB_8888, true);
        return tmp.compress(Bitmap.CompressFormat.PNG, 100, bos);
    } finally {
        if (tmp != null) {
            tmp.recycle();
            tmp = null;
        }
        //
        try {
            bos.close();
        } catch (Exception e) {
            //IOException, NullPointerException
        }
    }
}

使用调试,我意识到tmp.compress命令是需要花费一些时间才能处理的命令。

我尝试使用以下代码而不压缩图像。它变得更快了。

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
ContextWrapper c = new ContextWrapper(MainActivity.this);
File path = c.getFilesDir();
String fileName = imageIdArray[i] + ".png";
InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream(path + "/" + fileName); // "data/data/[package_name]/files/sample.png"
byte data[] = new byte[1024];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
    total += count;
    output.write(data, 0, count);
}
output.flush();
output.close();
input.close();

还有其他方法可以更快地保存图像吗?

1 个答案:

答案 0 :(得分:0)

        FileOutputStream out = null;
        String path = setOutputFilePath();
        try {
            out = new FileOutputStream(path);
            croppedBitmap2.compress(Bitmap.CompressFormat.JPEG, 100, out); // bmp is your Bitmap instance
            // PNG is a lossless format, the compression factor (100) is ignored

            LOGGER.debug("Saving image on the absolute path folder!");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }