2015-08-15 3 views
12

У меня есть строка URL, указывающий на изображение, сохранённое на внешнем запоминающем устройстве моего устройства:Получить эскиз URL из URL изображения

String imageUrl = "/storage/emulated/0/DCIM/100MEDIA/IMAG0823.jpg" 

Я хочу, чтобы запросить MediaStore, чтобы получить миниатюру для этого изображения. Это то, что я делаю прямо сейчас:

private String getImageThumbnailPath(Context ctx, String imageUrl){ 

    Cursor cursor = MediaStore.Images.Thumbnails.queryMiniThumbnails(
      ctx.getContentResolver(), Uri.fromFile(new File(imageUrl)), 
      MediaStore.Images.Thumbnails.MICRO_KIND, 
      null); 

    String url = ""; 
    if(cursor != null && cursor.getCount() > 0) { 
     cursor.moveToFirst(); 
     url = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Thumbnails.DATA)); 
     cursor.close(); 
    } 
    return url; 
} 

Однако вызов этого метода и печати его содержание ничего не показывает (курсор пуст).

Как запросить MediaStore для эскиза, связанного с моим изображением?

Редактировать

Я также попытался разобрать Uri непосредственно из URL изображения, как это:

Cursor cursor = MediaStore.Images.Thumbnails.queryMiniThumbnails(
     ctx.getContentResolver(), Uri.parse(imageUrl), 
     MediaStore.Images.Thumbnails.MINI_KIND, 
     null); 

Но результат тот же.

+0

Проверить значение Uri 'Uri.fromFile (новый файл (ImageUrl))' –

+0

это '/ хранение/эмулировать/0/DCIM/100MEDIA/IMAG0823.jpg '@dieter_h – Marcus

+3

Должен быть файл: ///storage/emulated/0/DCIM/100MEDIA/IMAG0823.jpg –

ответ

2

Я уверен, что класс ThumbnailUtils может помочь вам в этом.

Bitmap thumb = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(imagePath), THUMBSIZE, THUMBSIZE); 

Он возвращает Bitmap и Yous должны проверить, если оно не равно нулю, прежде чем использовать его. Иногда поврежденные файлы возвращают нулевые миниатюры.

Если вы не поддерживаете ничего ниже уровня API 8, вам следует использовать .

UPDATE

Если вам необходим путь миниатюру, пожалуйста, используйте этот метод,

public String getThumbnailPath(Uri uri) { 
    String[] projection = { MediaStore.Images.Media._ID }; 
    String result = null; 
    Cursor cursor = managedQuery(uri, projection, null, null, null); 
    int column_index = cursor 
      .getColumnIndexOrThrow(MediaStore.Images.Media._ID); 

    cursor.moveToFirst(); 
    long imageId = cursor.getLong(column_index); 
    cursor.close(); 

    cursor = MediaStore.Images.Thumbnails.queryMiniThumbnail(
      getContentResolver(), imageId, 
      MediaStore.Images.Thumbnails.MINI_KIND, 
      null); 
    if (cursor != null && cursor.getCount() > 0) { 
     cursor.moveToFirst(); 
     result = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA)); 
     cursor.close(); 
    } 
    return result; 
} 
+0

Возможно, в моем вопросе я был расплывчатым, но я хочу ** url ** растрового изображения, которое хранится в базе данных MediaStore. – Marcus

+0

managedQuery устарел. – Marcus

+0

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

0

вы можете использовать этот метод, чтобы изменить размер и сохранить миниатюру за исходное изображение:

private void resizer(String local_path, int original_image_w, int original_image_h){ 
    if(local_path.length() > 0){ 
     int imgW = (int) (original_image_w * 0.10); // Can Change By Device Width 
     int imgH = (int) (original_image_h * 0.10); // Can Change By Device height 
     Log.d("TAG_RESIZE", "Resizer, W : "+imgW+" , H : "+imgH); 
     Log.d("TAG_RESIZE", "Resizer local path : "+(new File(local_path).exists() ? "Exist" : "Not Exist")+" , \n"+local_path); 
     String ex = local_path.substring(local_path.lastIndexOf('.')+1, local_path.length()); 
     // ExceptionHelpers.eLog(G.Logs.Error, "Slider Downloader Image ex : " + ex); 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
     Bitmap dlBitmap = BitmapFactory.decodeFile(local_path, options); 
     Bitmap resized = Bitmap.createScaledBitmap(dlBitmap, imgW, imgH, true); 
     FileOutputStream fos = null; 
     try { 
      fos = new FileOutputStream(local_path.replace("."+ex, "_thumb."+ex)); 
      if(ex.toLowerCase().startsWith("jpg") || ex.toLowerCase().startsWith("jpeg")){ 
       resized.compress(Bitmap.CompressFormat.JPEG,100, fos); 
      }else if(ex.toLowerCase().startsWith("png")){ 
       resized.compress(Bitmap.CompressFormat.PNG,100, fos); 
      } 

      fos.flush(); 
      fos.close(); 

     } catch (Exception e) { 
      ExceptionHelpers.catchMessage(e); // My Custom Class To Log Errors, Useful To Save Error Logs And Send To Server 
     } 
    } 
} 

Также он будет захватывать память, но быстрее, чем RunTime. Размер

+1

Это то, что «Bitmap thumb = ThumbnailUtils.extractThumbnail (BitmapFactory.decodeFile (imagePath), THUMBSIZE, THUMBSIZE);' делает, зачем изобретать колесо? Кроме того, я не просил этого. – Marcus

+0

@Marcus сказал вам, что вы его используете – AndroSco

6

Следующий код работает, если у вас есть изображение из галереи, иначе мы не можем иметь миниатюру, и нам нужно создать эскиз.

Сначала вы должны найти MediaStore.Images.Media._ID

public String[] getRealPathFromURI(Uri contentUri) { 
    String[] proj = { MediaStore.Images.Media.DATA, 
      MediaStore.Images.Media._ID }; 
    Cursor cursor = getActivity().getContentResolver().query(contentUri, 
      proj, null, null, null); 
    int path_index = cursor.getColumnIndexOrThrow(proj[0]); 
    int id_index = cursor.getColumnIndexOrThrow(proj[1]); 
    cursor.moveToFirst(); 
    return new String[] { cursor.getString(path_index), 
      cursor.getLong(id_index) + "" }; 
} 

Сверху getRealPathFromURI теперь мы имеем MediaStore.Images.Media._ID, используйте этот идентификатор, чтобы найти миниатюру.

public static Bitmap getThumbnail(ContentResolver contentResolver, long id) { 
     Cursor cursor = contentResolver.query(
       MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
       new String[]{MediaStore.Images.Media.DATA}, // Which columns 
       // to return 
       MediaStore.Images.Media._ID + "=?", // Which rows to return 
       new String[]{String.valueOf(id)}, // Selection arguments 
       null);// order 

     if (cursor != null && cursor.getCount() > 0) { 
      cursor.moveToFirst(); 
      String filePath = cursor.getString(0); 
      cursor.close(); 
      int rotation = 0; 
      try { 
       ExifInterface exifInterface = new ExifInterface(filePath); 
       int exifRotation = exifInterface.getAttributeInt(
         ExifInterface.TAG_ORIENTATION, 
         ExifInterface.ORIENTATION_UNDEFINED); 
       if (exifRotation != ExifInterface.ORIENTATION_UNDEFINED) { 
        switch (exifRotation) { 
         case ExifInterface.ORIENTATION_ROTATE_180: 
          rotation = 180; 
          break; 
         case ExifInterface.ORIENTATION_ROTATE_270: 
          rotation = 270; 
          break; 
         case ExifInterface.ORIENTATION_ROTATE_90: 
          rotation = 90; 
          break; 
        } 
       } 
      } catch (IOException e) { 
       Log.e("getThumbnail", e.toString()); 
      } 
      Bitmap bitmap = MediaStore.Images.Thumbnails.getThumbnail(
        contentResolver, id, 
        MediaStore.Images.Thumbnails.MINI_KIND, null); 
      if (rotation != 0) { 
       Matrix matrix = new Matrix(); 
       matrix.setRotate(rotation); 
       bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), 
         bitmap.getHeight(), matrix, true); 
      } 
      return bitmap; 
     } else 
      return null; 
    } 

Для использования выше LOC

Обновлено

String[] imageInfo = getRealPathFromURI(Uri.parse("YOUR_IMAGE_PATH")); 
yourImageView.setImageBitmap(getThumbnail(getActivity() 
        .getContentResolver(), Long.parseLong(imageInfo[1]))); 

Uri.parse("YOUR_IMAGE_PATH") является contentUri

+0

Что такое contentUri в первом методе? – Marcus

+0

@Marcus, я только что обновил свой ответ –

+0

Я попробую, когда у меня будет шанс, спасибо – Marcus

-1

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

Intent galleryIntent = new Intent(Intent.ACTION_PICK, 
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
        galleryIntent.setType("image/*"); 
        startActivityForResult(galleryIntent, REQUEST_PICK_FROM_GALLERY); 

после этого в вашем onActivityResult сделать это

public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     super.onActivityResult(requestCode, resultCode, intent); 

     if (resultCode == Activity.RESULT_OK) { 
      switch (requestCode) { 
       case REQUEST_PICK_FROM_GALLERY: 
      Bitmap thumbnail = new File(intent.getExtras().get("data")); 
        break; 
      } 
     } 
    }