我想将图片加载到图像视图中,以便我可以切换图片。图片路径保存在一个数据库中,该数据库引用到我的项目中。因此,当我将图片加载到项目中并重新打开项目时,图片仍然可见,因为它们存储在数据库中。加载图片时出现OutOfMemoryException
我的问题是,我总是遇到OutOfMemoryException只有3张图片。我试图将inSampleSize减少到一个较低的值。但是,即使为15的inSampleSize,图片的最大数量可以是3
予测得的位图的分配的大小与getAllocationByteCount()
对于不同inSampleSizes:
- 15980544字节= 15 MB(inSample 1 )|| 998784字节=由于图片的0.95 MB(inSample 4)
- 249696字节= 0.23 MB(inSample 15)|| 27744字节= 0.02 MB(insample 30)
旋转(90°逆时针)予旋转他们与matrix.postRotate(90)
和矩阵我创建一个新的位图。我用bitmap.recyle()
删除旧的位图。新的位图的大小为499392字节= 0.47 MB
首先我开始一个摄像头意图:
// capturePicture() soll die Kamera starten und ein neues Bild soll gemacht werden können
private void capturePicture() {
// erstelle einen neuen Intent, damit sich die Kamera öffnet
// mit MediaStore.ACTION_IMAGE_CAPTURE wird angewiesen die Kamera zu starten
CameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// Sicherstellen, dass auf dem Handy eine Kamera installiert ist
if (CameraIntent.resolveActivity(getPackageManager()) != null) {
photoFile = null;
try {
// rufe die Methode createImageFile() auf, damit die Aufnahme in eine Datei gespeichert werden kann
photoFile = createImageFile();
} catch (IOException ex) {
// wenn das Erstellen des Bildes fehlschlug
Toast.makeText(thisActivity,"Bilddatei konnte nicht erstellt werden",
Toast.LENGTH_LONG).show();
}
// wenn es eine Datei gibt, soll diese in der ImageView angezeigt werden
if (photoFile != null) {
CameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
// rufe die onActivityForResult() Methode mit einer ID auf, um das Bild in der ImageView anzeigen zu können
this.savePicture(photoFile.getAbsolutePath(), photoFile.getName());
startActivityForResult(CameraIntent, REQUEST_TAKE_PHOTO);
//bitmap.recycle();
//System.gc();
this.reloadPicDB();
}
} else {
// TODO: auf den Play Store mit einer Kamera App verweisen
Toast.makeText(thisActivity,"Sie haben leider keine Kamera installiert", Toast.LENGTH_SHORT).show();
}
photoCount++;
}
在这种方法我调用该方法createImageFile()
为了创建一个镜像文件:
// erstellt eine Datei nachdem ein Foto gemacht wurde und gibt diese zurück
private File createImageFile() throws IOException {
// TODO: Sinnvollen Dateinamen für die Bilddateien geben
//String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmmss").format(new Date());
imageFileName = "JPEGNEU";
// TODO: überlegen, wohin die Bilddateien gespeichert werden sollen
//File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File pictureStorageDir = new File("/sdcard/neu/");
// In der Datei pictureImage werden der Name, Endung und Verzeichnis gespeichert
File pictureImage = File.createTempFile(imageFileName, /* prefix */
".jpg", /* suffix */
pictureStorageDir /* directory */
);
// ermittle den absoluten Pfad der Bilddatei und speichere diesen in den String PhotoPath
PhotoPath = pictureImage.getAbsolutePath();
// gebe die Bilddatei zurück, damit dieses in der Methode capturePicture weiter verwendet werden kann
return pictureImage;
}
图片将在onActivityResult()
方法来示出:
if(requestCode == REQUEST_TAKE_PHOTO){
ImageView beispiel = (ImageView) findViewById(R.id.beispiel);
BitmapFactory.Options options1 = new BitmapFactory.Options();
options1.inSampleSize = 15; //1/12 des Bildes zu laden
options1.inPreferredConfig = Config.ARGB_4444;
Bitmap image = BitmapFactory.decodeFile(PhotoPath, options1);
Log.d("Speicherausgabe", "Speicherausgabe0.1 " + image.getAllocationByteCount());
Matrix matrix = new Matrix();
matrix.postRotate(90);
bitmap = Bitmap.createBitmap(image, 0, 0, image.getWidth() , image.getHeight(), matrix, true);
image.recycle();
System.gc();
if(zaehlerRequestPhoto == 0){
beispiel.setImageBitmap(bitmap);
} else {
beispiel.setImageBitmap(bitmap);
Log.d("Speicherausgabe", "Speicherausgabe3 " + bitmap.getAllocationByteCount());
//System.gc();
}
在这种情况下,我应该如何避免OutOfMemoryException?