Method of Obtaining Picture and Video Thumbnail by Android Programming

  • 2021-07-06 11:42:40
  • OfStack

In this paper, an example is given to describe the method of obtaining thumbnails of pictures and videos by Android programming. Share it for your reference, as follows:

Since Android 2.2, the system has added a thumbnail ThumbnailUtils class, which is located at android. media. ThumbnailUtils of framework, which can help us get thumbnails of video or picture files in the system from mediaprovider. This class provides three static methods that can be directly called and obtained.

1. createVideoThumbnail


static Bitmap createVideoThumbnail(String filePath, int kind)
// Get thumbnails of video files 
// No. 1 1 Parameters are the location of the video file, such as /sdcard/android123.3gp , 
// No. 1 2 Parameters can be MINI_KIND Or  MICRO_KIND Ultimately, it is related to resolution 

2. extractThumbnail


static Bitmap extractThumbnail(Bitmap source, int width, int height, int options)
// Direct to Bitmap Perform a thumbnail operation 
// Finally 1 Parameters are defined as OPTIONS_RECYCLE_INPUT  To recycle resources 

3. extractThumbnail


static Bitmap extractThumbnail(Bitmap source, int width, int height)
//  This and the above method 1 Sample, none options Options 

Get video thumbnails in mobile phones:


public static Bitmap getVideoThumbnail(ContentResolver cr, Uri uri) {
  Bitmap bitmap = null;
  BitmapFactory.Options options = new BitmapFactory.Options();
  options.inDither = false;
  options.inPreferredConfig = Bitmap.Config.ARGB_8888;
  Cursor cursor = cr.query(uri,new String[] { MediaStore.Video.Media._ID }, null, null, null);
  if (cursor == null || cursor.getCount() == 0) {
 return null;
  }
  cursor.moveToFirst();
  String videoId = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media._ID)); //image id in image table.s
  if (videoId == null) {
  return null;
  }
  cursor.close();
  long videoIdLong = Long.parseLong(videoId);
  bitmap = MediaStore.Video.Thumbnails.getThumbnail(cr, videoIdLong,Images.Thumbnails.MICRO_KIND, options);
  return bitmap;
}

Get video thumbnails in the specified directory sdcard:


import java.io.File;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.ThumbnailUtils;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.widget.ImageView;
/**
* 获取图片和视频的缩略图
* 这两个方法必须在2.2及以上版本使用,因为其中使用了ThumbnailUtils这个类
*/
public class AndroidTestActivity extends Activity {
   private ImageView imageThumbnail;
   private ImageView videoThumbnail;
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);
   imageThumbnail = (ImageView) findViewById(R.id.image_thumbnail);
   videoThumbnail = (ImageView) findViewById(R.id.video_thumbnail);
   String imagePath = Environment.getExternalStorageDirectory()
    .getAbsolutePath()
    + File.separator
    + "photo"
    + File.separator
    + "yexuan.jpg";
   String videoPath = Environment.getExternalStorageDirectory()
    .getAbsolutePath()
    + File.separator
    + "video"
    + File.separator
    + "醋点灯.avi";
   imageThumbnail.setImageBitmap(getImageThumbnail(imagePath, 60, 60));
   videoThumbnail.setImageBitmap(getVideoThumbnail(videoPath, 60, 60,
    MediaStore.Images.Thumbnails.MICRO_KIND));
   }
   /**
   * 根据指定的图像路径和大小来获取缩略图
   * 此方法有两点好处:
   *   1. 使用较小的内存空间,第1次获取的bitmap实际上为null,只是为了读取宽度和高度,
   *    第2次读取的bitmap是根据比例压缩过的图像,第3次读取的bitmap是所要的缩略图。
   *   2. 缩略图对于原图像来讲没有拉伸,这里使用了2.2版本的新工具ThumbnailUtils,使
   *    用这个工具生成的图像不会被拉伸。
   * @param imagePath 图像的路径
   * @param width 指定输出图像的宽度
   * @param height 指定输出图像的高度
   * @return 生成的缩略图
   */
   private Bitmap getImageThumbnail(String imagePath, int width, int height) {
   Bitmap bitmap = null;
   BitmapFactory.Options options = new BitmapFactory.Options();
   options.inJustDecodeBounds = true;
   // 获取这个图片的宽和高,注意此处的bitmap为null
   bitmap = BitmapFactory.decodeFile(imagePath, options);
   options.inJustDecodeBounds = false; // 设为 false
   // 计算缩放比
   int h = options.outHeight;
   int w = options.outWidth;
   int beWidth = w / width;
   int beHeight = h / height;
   int be = 1;
   if (beWidth < beHeight) {
    be = beWidth;
   } else {
    be = beHeight;
   }
   if (be <= 0) {
    be = 1;
   }
   options.inSampleSize = be;
   // 重新读入图片,读取缩放后的bitmap,注意这次要把options.inJustDecodeBounds 设为 false
   bitmap = BitmapFactory.decodeFile(imagePath, options);
   // 利用ThumbnailUtils来创建缩略图,这里要指定要缩放哪个Bitmap对象
   bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
    ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
   return bitmap;
   }
   /**
   * 获取视频的缩略图
   * 先通过ThumbnailUtils来创建1个视频的缩略图,然后再利用ThumbnailUtils来生成指定大小的缩略图。
   * 如果想要的缩略图的宽和高都小于MICRO_KIND,则类型要使用MICRO_KIND作为kind的值,这样会节省内存。
   * @param videoPath 视频的路径
   * @param width 指定输出视频缩略图的宽度
   * @param height 指定输出视频缩略图的高度度
   * @param kind 参照MediaStore.Images.Thumbnails类中的常量MINI_KIND和MICRO_KIND。
   *      其中,MINI_KIND: 512 x 384,MICRO_KIND: 96 x 96
   * @return 指定大小的视频缩略图
   */
   private Bitmap getVideoThumbnail(String videoPath, int width, int height,
    int kind) {
   Bitmap bitmap = null;
   // 获取视频的缩略图
   bitmap = ThumbnailUtils.createVideoThumbnail(videoPath, kind);
   System.out.println("w"+bitmap.getWidth());
   System.out.println("h"+bitmap.getHeight());
   bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
    ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
   return bitmap;
   }
}

Layout:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <TextView
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text=" Picture thumbnail " />
    <ImageView
      android:id="@+id/image_thumbnail"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" />
    <TextView
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text=" Video thumbnail " />
    <ImageView
      android:id="@+id/video_thumbnail"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" />
</LinearLayout>

More readers interested in Android can check the topics of this site: "Summary of Android Graphics and Image Processing Skills", "Introduction and Advanced Tutorial of Android Development", "Summary of Android Resource Operation Skills", "Summary of View Skills in Android View" and "Summary of Android Control Usage"

I hope this article is helpful to everyone's Android programming.


Related articles: