[英]Image load in imageView from gallery become black
因此,我從廚房加載圖像並將其顯示到ImageView
,圖像變為黑色。 但不是全部圖像,只是確定的。 為什么會這樣?
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case RESULT_LOAD_IMAGE:
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK & null != data) {
imageUri = data.getData();
imageView.setImageURI(imageUri);
}
break;
}
}
然后我嘗試了這種方法。 圖像顯示,但看起來模糊。
imageView.setImageBitmap(decodeUri(imageUri));
private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException {
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(
getContentResolver().openInputStream(selectedImage), null, o);
final int REQUIRED_SIZE = 100;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true) {
if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE) {
break;
}
width_tmp /= 2;
height_tmp /= 2;
scale *= 2;
}
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
return BitmapFactory.decodeStream(
getContentResolver().openInputStream(selectedImage), null, o2);
}
是的,當由於圖像的高度和寬度較大(為2048*2048
而無法加載Bitmap
時,會發生這種情況。 通過相機拍攝的圖像通常尺寸較大,因此,調整圖像尺寸是一個好習慣。
下面僅是裁剪圖像的示例(如果尺寸過大且不考慮圖像比例)
public class InputImageCompressor extends Activity{
public static void compressInputImage(Intent data, Context context, ImageView newIV)
{
Bitmap bitmap;
Uri inputImageData = data.getData();
try
{
Bitmap bitmapInputImage = MediaStore.Images.Media.getBitmap(context.getContentResolver(), inputImageData);
if (bitmapInputImage.getWidth() > 2048 && bitmapInputImage.getHeight() > 2048)
{
bitmap = Bitmap.createScaledBitmap(bitmapInputImage, 1024, 1280, true);
newIV.setImageBitmap(bitmap);
}
else if (bitmapInputImage.getWidth() > 2048 && bitmapInputImage.getHeight() < 2048)
{
bitmap = Bitmap.createScaledBitmap(bitmapInputImage, 1920, 1200, true);
newIV.setImageBitmap(bitmap);
}
else if (bitmapInputImage.getWidth() < 2048 && bitmapInputImage.getHeight() > 2048)
{
bitmap = Bitmap.createScaledBitmap(bitmapInputImage, 1024, 1280, true);
newIV.setImageBitmap(bitmap);
}
else if (bitmapInputImage.getWidth() < 2048 && bitmapInputImage.getHeight() < 2048)
{
bitmap = Bitmap.createScaledBitmap(bitmapInputImage, bitmapInputImage.getWidth(), bitmapInputImage.getHeight(), true);
newIV.setImageBitmap(bitmap);
}
} catch (Exception e)
{
Toast.makeText(context, e.toString(), Toast.LENGTH_LONG).show();
}
}
}
在您的onActivityResult
中將其用作:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case RESULT_LOAD_IMAGE:
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK & null != data) {
InputImageCompressor.compressInputImage(data, your_activity_context.this, imageView);
}
break;
}
}
該代碼看起來不錯,您看到的圖像也很模糊,這也證實了這一點。
我認為REQUIRED_SIZE對於您嘗試的設備來說太小了。 對於初學者,請嘗試將REQUIRED_SIZE設置為更大的值,例如350,看看是否可以提高圖像質量。 如果是這樣,則使用REQUIRED_SIZE = SCREEN_WIDTH
代替靜態放置“大小”
要查找SCREEN_WIDTH,請在“活動”(或至少一個視圖)中使用以下命令:
DisplayMetrics displaymetrics = new DisplayMetrics();
((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int SCREEN_WIDTH = displaymetrics.widthPixels;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.