Android: MediaScanner生成thumbnail的算法

/** * Check if the corresponding thumbnail and mini-thumb have been created * for the given uri. This method creates both of them if they do not * exist yet or have been changed since last check. After thumbnails are * created, MINI_KIND thumbnail is stored in JPEG file and MICRO_KIND * thumbnail is stored in a random access file (MiniThumbFile). * * @throws IOException */ void execute() throws IOException { MiniThumbFile miniThumbFile = MiniThumbFile.instance(mUri); long magic = mMagic; if (magic != 0) { long fileMagic = miniThumbFile.getMagic(mOrigId); if (fileMagic == magic) { Cursor c = null; ParcelFileDescriptor pfd = null; try { c = mCr.query(mThumbUri, THUMB_PROJECTION, mOrigColumnName + " = " + mOrigId, null, null); if (c != null && c.moveToFirst()) { pfd = mCr.openFileDescriptor( mThumbUri.buildUpon().appendPath(c.getString(0)).build(), "r"); } } catch (IOException ex) { // MINI_THUMBNAIL not exists, ignore the exception and generate one. } finally { if (c != null) c.close(); if (pfd != null) { pfd.close(); return; } } } } // If we can't retrieve the thumbnail, first check if there is one // embedded in the EXIF data. If not, or it's not big enough, // decompress the full size image. Bitmap bitmap = null; if (mPath != null) { if (mIsVideo) { bitmap = ThumbnailUtils.createVideoThumbnail(mPath, Video.Thumbnails.MINI_KIND); } else { bitmap = ThumbnailUtils.createImageThumbnail(mPath, Images.Thumbnails.MINI_KIND); } if (bitmap == null) { Log.w(TAG, "Can't create mini thumbnail for " + mPath); return; } Uri uri = updateDatabase(bitmap); if (uri != null) { OutputStream thumbOut = mCr.openOutputStream(uri); bitmap.compress(Bitmap.CompressFormat.JPEG, 85, thumbOut); thumbOut.close(); } } bitmap = ThumbnailUtils.extractThumbnail(bitmap, ThumbnailUtils.TARGET_SIZE_MICRO_THUMBNAIL, ThumbnailUtils.TARGET_SIZE_MICRO_THUMBNAIL, ThumbnailUtils.OPTIONS_RECYCLE_INPUT); if (bitmap != null) { ByteArrayOutputStream miniOutStream = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 75, miniOutStream); bitmap.recycle(); byte [] data = null; try { miniOutStream.close(); data = miniOutStream.toByteArray(); } catch (java.io.IOException ex) { Log.e(TAG, "got exception ex " + ex); } // We may consider retire this proprietary format, after all it's size is only // 128 x 128 at most, which is still reasonable to be stored in database. // Gallery application can use the MINI_THUMB_MAGIC value to determine if it's // time to query and fetch by using Cursor.getBlob if (data != null) { // make a new magic number since things are out of sync do { magic = mRandom.nextLong(); } while (magic == 0); miniThumbFile.saveMiniThumbToFile(data, mOrigId, magic); ContentValues values = new ContentValues(); // both video/images table use the same column name "mini_thumb_magic" values.put(ImageColumns.MINI_THUMB_MAGIC, magic); mCr.update(mUri, values, null, null); } } else { Log.w(TAG, "can't create bitmap for thumbnail."); } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值