Получить эскиз 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 для URL-адреса эскиза, связанного с моим URL-адресом изображения?

Edit

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

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

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

Ответ 1

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

Сначала вам нужно найти 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

Ответ 2

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

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

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

Если вы не поддерживаете ничего ниже уровня 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;
}

Ответ 3

вы можете использовать этот метод для изменения размера и сохранения эскиза за оригинальным изображением:

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 resize

Ответ 4

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

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;
            }
        }
    }