android - Android 中的程序化图像大小调整、内存问题

标签 android image out-of-memory

几天来,我一直在努力解决这个问题。也许是几周。字面上地。 :(

所以我在 SD 卡上有一张图像,该图像很可能来自内置摄像头。我想获取该图像并将其下采样到任意大小(但总是更小并且永远不会更大)。我的代码使用标准 Android 位图方法来解码、调整大小、重新压缩和保存图像。只要最终图像小于 3MP 左右,一切都可以正常工作。如果图像较大,或者如果我尝试同时执行其中多个操作,则应用程序会崩溃并出现 OutOfMemoryError。我知道为什么会发生这种情况,而且我知道它的发生是出于完全合法的原因,我只是希望它不再发生。

听着,我不是想在这里发射火箭。我想做的就是调整相机图像的大小并将其转储到 OutputStream 甚至临时文件中。肯定有人做过这样的事。我不需要你为我编写代码,也不需要我的手。但在我的各种编程流产和痴迷谷歌搜索的日子里,我什至不知道该朝哪个方向前进。粗略地说,有谁知道如何解码 JPEG、对其进行下采样、以 JPEG 重新压缩它,然后将其发送出去在 OutputStream 上而不分配大量内存?

最佳答案

好吧,我知道有点晚了,但是,我遇到了这个问题,并且找到了解决方案。这实际上很简单,我确信它支持 api 10(我不知道 10 之前的情况)。我用手机尝试过这个。它是带有 8mp 摄像头的三星 Galaxy s2,代码将摄像头图像的大小完美调整为 168x168 以及我在网上找到的图像。我也使用文件管理器检查了图像。我从未尝试过将图像大小调整为更大的分辨率。

private Bitmap resize(Bitmap bp, int witdh, int height){
    return Bitmap.createScaledBitmap(bp, width, height, false);
}

你可以这样保存

private void saveBitmap(Bitmap bp) throws FileNotFoundException{
    String state = Environment.getExternalStorageState();
    File folder;
    //if there is memory card available code choose that
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        folder=Environment.getExternalStorageDirectory();
    }else{
        folder=Environment.getDataDirectory();
    }
    folder=new File(folder, "/aaaa");
    if(!folder.exists()){
        folder.mkdir();
    }

    File file=new File(folder, (int)(Math.random()*10000)+".jpg");
    FileOutputStream os=new FileOutputStream(file);
    bp.compress(Bitmap.CompressFormat.JPEG, 90, os);
}

感谢这个link

关于android - Android 中的程序化图像大小调整、内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16183900/

相关文章:

java - Android上使用SoftReference缓存Bitmap导致OOM

没有 fragment 的 Android 功能区菜单

Android Studio 将语法标记为错误,但 gradle 编译

image - WP7 图像 Uri 作为静态资源

javascript - 根据 img src 更改背景 JQuery

android - 使用带有返回堆栈的 fragment 时如何减少内存使用?

android - 将日期绑定(bind)到 SQLiteStatement

android - 在我自己的自定义 Android 主屏幕中,如何捕捉主页按钮?

java - 找不到指定的模块。 Tess4j 使用 Maven

android - picasso 在加载图像时内存不足