我必须将图像保存到sqlite db.It正在工作。例如我可以保存来自相机的照片。但是当我从照片库中选择一张照片(700kb或更多)时,它没有保存到DB中。所以我认为我可以制作这么大尺寸的照片。所以我在下面写了这些代码;
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == SELECT_PHOTO && resultCode == RESULT_OK){
Uri selectedImage = data.getData();
InputStream imageStream = null;
try {
imageStream = getContentResolver().openInputStream(selectedImage);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//Resmin boyutu küçültüldükten sonra DB'ye atılacak.102400,512000
Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
cekilenFoto.setImageBitmap(yourSelectedImage);
resimData = getBitmapAsByteArray(yourSelectedImage);
}
}
这不是小事。它正在关闭设备上的应用程序。这里出了什么问题?
答案 0 :(得分:0)
我认为重新调整图像的效果会减少图像的大小。
if ( yourSelectedImage!= null) {
Bitmap resizedBitmap = Bitmap.createScaledBitmap(bit, width,
height, true);
cekilenFoto.setImageBitmap(resizedBitmap);
resimData = getBitmapAsByteArray(resizedBitmap);
}
你可以在int中给出的宽度和高度以及可变大小。 恩。
int width=500;
int height=500;
答案 1 :(得分:0)
虽然Sridhar的答案是有效的,但有一点要记住,它需要首先以完整大小解码InputStream,从而增加内存使用量。如果InputStream表示非常大的图像,这可能是一个问题,因为它可能导致OutOfMemoryExceptions。这是一个直接从InputStream到缩放位图的方法:
public static Bitmap scaledBitmapFromStream(Context context, InputStream tempIs) {
// Buffer the InputStream so that it can be accessed twice.
InputStream is = new BufferedInputStream(tempIs);
// Find the dimensions of the input image, and calculate the sampleSize.
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(is, null, options);
options.inJustDecodeBounds = false;
// Calculate the inSampleSize. This is the factor that the image will be rescaled by.
options.inSampleSize = calculateInSampleSize(context, options.outWidth, options.outHeight);
// Reset the input stream, so it can be read again.
try {
is.reset();
} catch (IOException e) {
throw new RuntimeException("BufferedInputStream.reset() failed.", e);
}
// The 'options' parameter here tells the BitmapFactory to downscale.
Bitmap output = BitmapFactory.decodeStream(is, null, options);
// Close the input stream.
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
return output;
}
/**
* How much you want to downsample will vary based on your application, but this implementation
* calculates a safe display size based on devices screen resolution and OpenGL MAX_TEXTURE_SIZE.
*/
public static int calculateInSampleSize(Context context, int inputWidth, int inputHeight) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
final int maxWidth = Math.min(displayMetrics.widthPixels, GLES20.GL_MAX_TEXTURE_SIZE);
final int maxHeight = Math.min(displayMetrics.heightPixels, GLES20.GL_MAX_TEXTURE_SIZE);
int inSampleSize = 1;
if (inputWidth > maxWidth || inputHeight > maxHeight) {
// Calculate ratios of height and width to requested height and width
final int heightRatio = Math.round((float) inputHeight / (float) maxHeight);
final int widthRatio = Math.round((float) inputWidth / (float) maxWidth);
// Choose the smallest ratio as inSampleSize value, this will guarantee
// a final image with both dimensions larger than or equal to the
// requested height and width.
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
有关inJustDecodeBounds和Bitmap sampling的更多信息,请参阅https://developer.android.com/training/displaying-bitmaps/load-bitmap.html。