我想从相机拍摄图像,并从画廊中取出我做过的部分。 当我通过图像路径将图像从一个活动带到另一个活动时,它会在拍摄第四张图像时显示内存错误,因此我想从图库中获取图像,当我从图库中获取图像时,它应该被压缩,因此它不应该有内存不足错误字节分配。
感谢。
这是我的代码,任何人都可以帮助
imageview1=(ImageView) findViewById(R.id.image1);
imageview2=(ImageView) findViewById(R.id.image2);
imageview3=(ImageView) findViewById(R.id.image3);
imageview4=(ImageView) findViewById(R.id.image4);
Bitmap b = (Bitmap) getIntent().getParcelableExtra("data") ;
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
locationname = preferences.getString("Location", "Location");
SharedPreferences preferences1 = PreferenceManager.getDefaultSharedPreferences(this);
categoryname = preferences1.getString("categoryname", "categoryname");
SharedPreferences imagepath1 = PreferenceManager.getDefaultSharedPreferences(this);
selectedImagePath1 = imagepath1.getString("picturePath1", "picturePath1");
SharedPreferences imagepath2 = PreferenceManager.getDefaultSharedPreferences(this);
selectedImagePath2 = imagepath2.getString("picturePath2", "picturePath2");
SharedPreferences imagepath3 = PreferenceManager.getDefaultSharedPreferences(this);
selectedImagePath3 = imagepath3.getString("picturePath3", "picturePath3");
SharedPreferences imagepath4 = PreferenceManager.getDefaultSharedPreferences(this);
selectedImagePath4 = imagepath4.getString("picturePath4", "picturePath4");
Bitmap thumbnail1 = (BitmapFactory.decodeFile(selectedImagePath1));
ByteArrayOutputStream stream = new ByteArrayOutputStream();
thumbnail1.compress(Bitmap.CompressFormat.JPEG, 90, stream);
Bitmap thumbnail2 = (BitmapFactory.decodeFile(selectedImagePath2));
ByteArrayOutputStream stream1 = new ByteArrayOutputStream();
thumbnail2.compress(Bitmap.CompressFormat.JPEG, 90, stream1);
Bitmap thumbnail3 = (BitmapFactory.decodeFile(selectedImagePath3));
ByteArrayOutputStream stream2 = new ByteArrayOutputStream();
thumbnail2.compress(Bitmap.CompressFormat.JPEG, 90, stream2);
Bitmap thumbnail4 = (BitmapFactory.decodeFile(selectedImagePath4));
ByteArrayOutputStream stream3 = new ByteArrayOutputStream();
thumbnail4.compress(Bitmap.CompressFormat.JPEG, 90, stream3);
imageview1.setImageBitmap(thumbnail1);
thumbnail1.recycle();
imageview2.setImageBitmap(thumbnail2);
imageview3.setImageBitmap(thumbnail3 );
imageview4.setImageBitmap(thumbnail4);
答案 0 :(得分:2)
因图像大小而发生。你必须调整大小或压缩图像。下面的代码将帮助您。根据您的需要使用:
public static Bitmap loadResizedBitmap( String filename, int width, int height, boolean exact ) {
Bitmap bitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile( filename, options );
if ( options.outHeight > 0 && options.outWidth > 0 ) {
options.inJustDecodeBounds = false;
options.inSampleSize = 2;
while ( options.outWidth / options.inSampleSize > width
&& options.outHeight / options.inSampleSize > height ) {
options.inSampleSize++;
}
options.inSampleSize--;
bitmap = BitmapFactory.decodeFile( filename, options );
if ( bitmap != null && exact ) {
bitmap = Bitmap.createScaledBitmap( bitmap, width, height, false );
}
}
return bitmap;
}
OR
public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
答案 1 :(得分:1)
请尝试以下代码: -
public String compressImage(String imageUri) {
String filePath = getRealPathFromURI(imageUri);
Bitmap scaledBitmap = null;
BitmapFactory.Options options = new BitmapFactory.Options();
// by setting this field as true, the actual bitmap pixels are not loaded in the memory. Just the bounds are loaded. If
// you try the use the bitmap here, you will get null.
options.inJustDecodeBounds = true;
Bitmap bmp = BitmapFactory.decodeFile(filePath, options);
int actualHeight = options.outHeight;
int actualWidth = options.outWidth;
// max Height and width values of the compressed image is taken as 816x612
float maxHeight = 816.0f;
float maxWidth = 612.0f;
float imgRatio = actualWidth / actualHeight;
float maxRatio = maxWidth / maxHeight;
// width and height values are set maintaining the aspect ratio of the image
if (actualHeight > maxHeight || actualWidth > maxWidth) {
if (imgRatio < maxRatio) { imgRatio = maxHeight / actualHeight; actualWidth = (int) (imgRatio * actualWidth); actualHeight = (int) maxHeight; } else if (imgRatio > maxRatio) {
imgRatio = maxWidth / actualWidth;
actualHeight = (int) (imgRatio * actualHeight);
actualWidth = (int) maxWidth;
} else {
actualHeight = (int) maxHeight;
actualWidth = (int) maxWidth;
}
}
// setting inSampleSize value allows to load a scaled down version of the original image
options.inSampleSize = calculateInSampleSize(options, actualWidth, actualHeight);
// inJustDecodeBounds set to false to load the actual bitmap
options.inJustDecodeBounds = false;
// this options allow android to claim the bitmap memory if it runs low on memory
options.inPurgeable = true;
options.inInputShareable = true;
options.inTempStorage = new byte[16 * 1024];
try {
// load the bitmap from its path
bmp = BitmapFactory.decodeFile(filePath, options);
} catch (OutOfMemoryError exception) {
exception.printStackTrace();
}
try {
scaledBitmap = Bitmap.createBitmap(actualWidth, actualHeight,Bitmap.Config.ARGB_8888);
} catch (OutOfMemoryError exception) {
exception.printStackTrace();
}
float ratioX = actualWidth / (float) options.outWidth;
float ratioY = actualHeight / (float) options.outHeight;
float middleX = actualWidth / 2.0f;
float middleY = actualHeight / 2.0f;
Matrix scaleMatrix = new Matrix();
scaleMatrix.setScale(ratioX, ratioY, middleX, middleY);
Canvas canvas = new Canvas(scaledBitmap);
canvas.setMatrix(scaleMatrix);
canvas.drawBitmap(bmp, middleX - bmp.getWidth() / 2, middleY - bmp.getHeight() / 2, new Paint(Paint.FILTER_BITMAP_FLAG));
// check the rotation of the image and display it properly
ExifInterface exif;
try {
exif = new ExifInterface(filePath);
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION, 0);
Log.d("EXIF", "Exif: " + orientation);
Matrix matrix = new Matrix();
if (orientation == 6) {
matrix.postRotate(90);
Log.d("EXIF", "Exif: " + orientation);
} else if (orientation == 3) {
matrix.postRotate(180);
Log.d("EXIF", "Exif: " + orientation);
} else if (orientation == 8) {
matrix.postRotate(270);
Log.d("EXIF", "Exif: " + orientation);
}
scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0,
scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix,
true);
} catch (IOException e) {
e.printStackTrace();
}
FileOutputStream out = null;
String filename = getFilename();
try {
out = new FileOutputStream(filename);
// write the compressed bitmap at the destination specified by filename.
scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 80, out);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return filename;
}
http://voidcanvas.com/whatsapp-like-image-compression-in-android/
答案 2 :(得分:0)
在android中,每个位图都加载到内存中,得到&#34;宽度*高度* 4个字节&#34;的内存大小。 所以你应该把一个较小的位图带到内存中。 看看这个link