几天来,我一直在努力解决这个问题。也许是几周。字面上地。 :(
所以我在 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/