2015-12-19 3 views
0

Это звучит просто, но я не могу загрузить растровое изображение, которое я взял с камерой, в свое приложение. Ну, технически я могу, но ничего не получается.Загрузка Bitmap из ExternalStorage

Я использую этот код для съемки на onClick:

count++; 
      file = dir+count+".jpg"; 
      File newfile = new File(file); 
      try { 
       newfile.createNewFile(); 
      } catch (IOException e) {}  

      Uri outputFileUri = Uri.fromFile(newfile); 

      Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
      startActivityForResult(cameraIntent, TAKE_PHOTO_CODE); 

Где

dir - final String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

И этот код для загрузки изображения:

 String location = new String(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/" + count + ".jpg"); 
     Bitmap myBitmap = BitmapFactory.decodeFile(location); 
     Bitmap mutableBitmap = myBitmap.copy(Bitmap.Config.ARGB_8888, true); 
     Canvas canvas = new Canvas(mutableBitmap); 
     wv2.draw(canvas); 
     tstImage.setImageBitmap(mutableBitmap); 
     text.setText(Float.toString(myBitmap.getHeight()) + " " + Float.toString(myBitmap.getWidth()) + " px"); 

Где

count - Целое число, которое представляет имя образа

wv2 - пользовательский WebView, в котором я рисовать холст.

Я не думаю, что эти строки актуальны, но не помешает разместить дополнительную информацию - вы никогда не знаете.

Canvas canvas = new Canvas(mutableBitmap); 
wv2.draw(canvas); 

В этой строке отображается текст с размерами изображения. Я использую его, чтобы проверить, загружаю ли я растровое изображение.

text.setText(Float.toString(myBitmap.getHeight()) + " " + Float.toString(myBitmap.getWidth()) + " px"); 

Когда я бегу не получает отображается этот код изображения, но текст показывает правильные размеры, что должно означать, что я загрузить растровое изображение. Что я делаю не так? В чем проблема?

[UPDATE]

Я думаю, что я делаю успехи. Теперь у меня проблема outOfMemory, и приложение падает.

 String path = Environment.getExternalStorageDirectory()+ "/Pictures/" + count + ".jpg"; 
     File imgFile = new File(path); 
     if(imgFile.exists()){ 
      Bitmap mBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 

      tstImage.setImageBitmap(mBitmap); 
     } else { 
      Log.d("Ciaren", "File doesn't exist"); 
     } 
+0

Как вы убедитесь, что изображение, которое вы снимаете с камеры, имеет тот же путь, который вы определили выше в коде? – Pankaj

+0

Обновлен мой код –

ответ

0

Вместо того, чтобы использовать растровое изображение получить Ури или путь и использовать Picasso, чтобы загрузить изображение в ImageView

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode != Activity.RESULT_OK) { 
     return; 
    } 
switch(requestcode){ 
    case MEDIA_TYPE_IMAGE: 
      Uri selectedImageUri = data.getData(); 
      Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), seletedImageUri); 
Picasso.with(getContext()).load(selectedImageUri).fit().into(imgDp); 
      break; 
    } 
} 
+0

Как это работает? Что оно делает? И, наконец, мне нужно сделать некоторые изменения в изображении (рисовать линии через холст на нем), так будет ли он работать с этим? –

+0

Хорошо, тогда избегайте пикассо. Я изменил ответ, теперь вы можете получить растровое изображение из uri и соответственно внести свою модификацию. – iamdeowanshi

+0

Eclipse не распознает 'Picasso' или' MEDIA_TYPE_IMAGE' –

1

OOM указывает, что изображение является слишком большой для памяти для обработки. Здесь есть два решения:

Либо сделайте свой путь с помощью largeHeap="true" в манифесте, который в порядке, но может привести к проблемам в будущем.

Или вы можете изменить параметры загрузки растрового изображения, чтобы он занимал меньше памяти одновременно. Таким образом, на изображение потребуется больше времени для загрузки, но исключить возможность сбоя. Кроме того, разница во времени едва заметна.

Смежные вопросы