您的位置:首页 > 移动开发 > Android开发

Android 使用ThumbnailUtils类获取视频的缩略图

2014-06-13 10:37 405 查看
前言

欢迎大家我分享和推荐好用的代码段~~

声明

欢迎转载,但请保留文章原始出处:

CSDN:http://www.csdn.net

雨季o莫忧离:http://blog.csdn.net/luckkof


正文

今天看了一段代码,是关于获取视频的缩略图的,让我认识了一个ThumbnailUtils类,代码如下。

[java] view
plaincopy





Bitmap bitmap = ThumbnailUtils.createVideoThumbnail(path, Thumbnails.MINI_KIND); //用于获取视频的缩略图

BitmapDrawable background=new BitmapDrawable(bitmap);

通过察看android.media.ThumbnailUtils的源码,可以发现该类提供了三种静态方法可以直接调用获取,从而可以帮助我们获取系统视频或图片文件的缩略图。



第一个方法可以用来创建一张视频的缩略图,如果视频已损坏或者格式不支持可能返回null

[java] view
plaincopy





/**

* Create a video thumbnail for a video. May return null if the video is

* corrupt or the format is not supported.

*

* @param filePath the path of video file

* @param kind could be MINI_KIND or MICRO_KIND

*/

public static Bitmap createVideoThumbnail(String filePath, int kind) {

Bitmap bitmap = null;

MediaMetadataRetriever retriever = new MediaMetadataRetriever();

try {

retriever.setDataSource(filePath);

bitmap = retriever.getFrameAtTime(-1);

} catch (IllegalArgumentException ex) {

// Assume this is a corrupt video file

} catch (RuntimeException ex) {

// Assume this is a corrupt video file.

} finally {

try {

retriever.release();

} catch (RuntimeException ex) {

// Ignore failures while cleaning up.

}

}

if (bitmap == null) return null;

if (kind == Images.Thumbnails.MINI_KIND) {

// Scale down the bitmap if it's too large.

int width = bitmap.getWidth();

int height = bitmap.getHeight();

int max = Math.max(width, height);

if (max > 512) {

float scale = 512f / max;

int w = Math.round(scale * width);

int h = Math.round(scale * height);

bitmap = Bitmap.createScaledBitmap(bitmap, w, h, true);

}

} else if (kind == Images.Thumbnails.MICRO_KIND) {

bitmap = extractThumbnail(bitmap,

TARGET_SIZE_MICRO_THUMBNAIL,

TARGET_SIZE_MICRO_THUMBNAIL,

OPTIONS_RECYCLE_INPUT);

}

return bitmap;

}

参数说明:

filePath表示视频文件路径
kind表示类型,可以有两个选项,分别是Images.Thumbnails.MICRO_KIND和Images.Thumbnails.MINI_KIND,其中,MINI_KIND: 512 x 384,MICRO_KIND: 96 x 96,当然读了代码你会发现,你也可以传入任意的int型数字,只是就不会对获取的bitmap进行相关的设置,我们可以自己使用extractThumbnail(
Bitmap source, int width, int height)方法对返回的bitmap进行相关设置。

第二个方法可以用来创建一个指定大小的缩略图

[java] view
plaincopy





/**

* Creates a centered bitmap of the desired size.

*

* @param source original bitmap source

* @param width targeted width

* @param height targeted height

*/

public static Bitmap extractThumbnail(

Bitmap source, int width, int height) {

return extractThumbnail(source, width, height, OPTIONS_NONE);

}

参数说明:

source表示图片源文件(Bitmap类型)

width表示指定压缩成后的宽度

height表示指定压缩成后的高度

第三个方法可以用来创建一个指定大小的缩略图

[java] view
plaincopy





/**

* Creates a centered bitmap of the desired size.

*

* @param source original bitmap source

* @param width targeted width

* @param height targeted height

* @param options options used during thumbnail extraction

*/

public static Bitmap extractThumbnail(

Bitmap source, int width, int height, int options) {

if (source == null) {

return null;

}

float scale;

if (source.getWidth() < source.getHeight()) {

scale = width / (float) source.getWidth();

} else {

scale = height / (float) source.getHeight();

}

Matrix matrix = new Matrix();

matrix.setScale(scale, scale);

Bitmap thumbnail = transform(matrix, source, width, height,

OPTIONS_SCALE_UP | options);

return thumbnail;

}

参数说明:

source表示图片源文件(Bitmap类型)

width表示指定压缩成后的宽度

height表示指定压缩成后的高度
options表示在缩略图抽取时提供的选项,如果options定义为OPTIONS_RECYCLE_INPUT,则回收@param source这个资源文件(除非缩略图等于@param source)

=====================华丽丽的分界线========================

下面展示两个封装好的代码,用来获取图像和视频的缩略图

[java] view
plaincopy





/**

* 根据指定的图像路径和大小来获取缩略图

* 此方法有两点好处:

* 1. 使用较小的内存空间,第一次获取的bitmap实际上为null,只是为了读取宽度和高度,

* 第二次读取的bitmap是根据比例压缩过的图像,第三次读取的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来创建一个视频的缩略图,然后再利用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;

}

=====================华丽丽的分界线========================

最后附上ThumbnailUtils源码,代码如下:

[java] view
plaincopy





/*

* Copyright (C) 2009 The Android Open Source Project

*

* Licensed under the Apache License, Version 2.0 (the "License");

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

* http://www.apache.org/licenses/LICENSE-2.0
*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*/

package android.media;

import android.content.ContentResolver;

import android.content.ContentUris;

import android.content.ContentValues;

import android.database.Cursor;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Matrix;

import android.graphics.Rect;

import android.media.MediaMetadataRetriever;

import android.media.MediaFile.MediaFileType;

import android.net.Uri;

import android.os.ParcelFileDescriptor;

import android.provider.BaseColumns;

import android.provider.MediaStore.Images;

import android.provider.MediaStore.Images.Thumbnails;

import android.util.Log;

import java.io.FileInputStream;

import java.io.FileDescriptor;

import java.io.IOException;

import java.io.OutputStream;

/**

* Thumbnail generation routines for media provider.

*/

public class ThumbnailUtils {

private static final String TAG = "ThumbnailUtils";

/* Maximum pixels size for created bitmap. */

private static final int MAX_NUM_PIXELS_THUMBNAIL = 512 * 384;

private static final int MAX_NUM_PIXELS_MICRO_THUMBNAIL = 128 * 128;

private static final int UNCONSTRAINED = -1;

/* Options used internally. */

private static final int OPTIONS_NONE = 0x0;

private static final int OPTIONS_SCALE_UP = 0x1;

/**

* Constant used to indicate we should recycle the input in

* {@link #extractThumbnail(Bitmap, int, int, int)} unless the output is the input.

*/

public static final int OPTIONS_RECYCLE_INPUT = 0x2;

/**

* Constant used to indicate the dimension of mini thumbnail.

* @hide Only used by media framework and media provider internally.

*/

public static final int TARGET_SIZE_MINI_THUMBNAIL = 320;

/**

* Constant used to indicate the dimension of micro thumbnail.

* @hide Only used by media framework and media provider internally.

*/

public static final int TARGET_SIZE_MICRO_THUMBNAIL = 96;

/**

* This method first examines if the thumbnail embedded in EXIF is bigger than our target

* size. If not, then it'll create a thumbnail from original image. Due to efficiency

* consideration, we want to let MediaThumbRequest avoid calling this method twice for

* both kinds, so it only requests for MICRO_KIND and set saveImage to true.

*

* This method always returns a "square thumbnail" for MICRO_KIND thumbnail.

*

* @param filePath the path of image file

* @param kind could be MINI_KIND or MICRO_KIND

* @return Bitmap, or null on failures

*

* @hide This method is only used by media framework and media provider internally.

*/

public static Bitmap createImageThumbnail(String filePath, int kind) {

boolean wantMini = (kind == Images.Thumbnails.MINI_KIND);

int targetSize = wantMini

? TARGET_SIZE_MINI_THUMBNAIL

: TARGET_SIZE_MICRO_THUMBNAIL;

int maxPixels = wantMini

? MAX_NUM_PIXELS_THUMBNAIL

: MAX_NUM_PIXELS_MICRO_THUMBNAIL;

SizedThumbnailBitmap sizedThumbnailBitmap = new SizedThumbnailBitmap();

Bitmap bitmap = null;

MediaFileType fileType = MediaFile.getFileType(filePath);

if (fileType != null && fileType.fileType == MediaFile.FILE_TYPE_JPEG) {

createThumbnailFromEXIF(filePath, targetSize, maxPixels, sizedThumbnailBitmap);

bitmap = sizedThumbnailBitmap.mBitmap;

}

if (bitmap == null) {

FileInputStream stream = null;

try {

stream = new FileInputStream(filePath);

FileDescriptor fd = stream.getFD();

BitmapFactory.Options options = new BitmapFactory.Options();

options.inSampleSize = 1;

options.inJustDecodeBounds = true;

BitmapFactory.decodeFileDescriptor(fd, null, options);

if (options.mCancel || options.outWidth == -1

|| options.outHeight == -1) {

return null;

}

options.inSampleSize = computeSampleSize(

options, targetSize, maxPixels);

options.inJustDecodeBounds = false;

options.inDither = false;

options.inPreferredConfig = Bitmap.Config.ARGB_8888;

bitmap = BitmapFactory.decodeFileDescriptor(fd, null, options);

} catch (IOException ex) {

Log.e(TAG, "", ex);

} catch (OutOfMemoryError oom) {

Log.e(TAG, "Unable to decode file " + filePath + ". OutOfMemoryError.", oom);

} finally {

try {

if (stream != null) {

stream.close();

}

} catch (IOException ex) {

Log.e(TAG, "", ex);

}

}

}

if (kind == Images.Thumbnails.MICRO_KIND) {

// now we make it a "square thumbnail" for MICRO_KIND thumbnail

bitmap = extractThumbnail(bitmap,

TARGET_SIZE_MICRO_THUMBNAIL,

TARGET_SIZE_MICRO_THUMBNAIL, OPTIONS_RECYCLE_INPUT);

}

return bitmap;

}

/**

* Create a video thumbnail for a video. May return null if the video is

* corrupt or the format is not supported.

*

* @param filePath the path of video file

* @param kind could be MINI_KIND or MICRO_KIND

*/

public static Bitmap createVideoThumbnail(String filePath, int kind) {

Bitmap bitmap = null;

MediaMetadataRetriever retriever = new MediaMetadataRetriever();

try {

retriever.setDataSource(filePath);

bitmap = retriever.getFrameAtTime(-1);

} catch (IllegalArgumentException ex) {

// Assume this is a corrupt video file

} catch (RuntimeException ex) {

// Assume this is a corrupt video file.

} finally {

try {

retriever.release();

} catch (RuntimeException ex) {

// Ignore failures while cleaning up.

}

}

if (bitmap == null) return null;

if (kind == Images.Thumbnails.MINI_KIND) {

// Scale down the bitmap if it's too large.

int width = bitmap.getWidth();

int height = bitmap.getHeight();

int max = Math.max(width, height);

if (max > 512) {

float scale = 512f / max;

int w = Math.round(scale * width);

int h = Math.round(scale * height);

bitmap = Bitmap.createScaledBitmap(bitmap, w, h, true);

}

} else if (kind == Images.Thumbnails.MICRO_KIND) {

bitmap = extractThumbnail(bitmap,

TARGET_SIZE_MICRO_THUMBNAIL,

TARGET_SIZE_MICRO_THUMBNAIL,

OPTIONS_RECYCLE_INPUT);

}

return bitmap;

}

/**

* Creates a centered bitmap of the desired size.

*

* @param source original bitmap source

* @param width targeted width

* @param height targeted height

*/

public static Bitmap extractThumbnail(

Bitmap source, int width, int height) {

return extractThumbnail(source, width, height, OPTIONS_NONE);

}

/**

* Creates a centered bitmap of the desired size.

*

* @param source original bitmap source

* @param width targeted width

* @param height targeted height

* @param options options used during thumbnail extraction

*/

public static Bitmap extractThumbnail(

Bitmap source, int width, int height, int options) {

if (source == null) {

return null;

}

float scale;

if (source.getWidth() < source.getHeight()) {

scale = width / (float) source.getWidth();

} else {

scale = height / (float) source.getHeight();

}

Matrix matrix = new Matrix();

matrix.setScale(scale, scale);

Bitmap thumbnail = transform(matrix, source, width, height,

OPTIONS_SCALE_UP | options);

return thumbnail;

}

/*

* Compute the sample size as a function of minSideLength

* and maxNumOfPixels.

* minSideLength is used to specify that minimal width or height of a

* bitmap.

* maxNumOfPixels is used to specify the maximal size in pixels that is

* tolerable in terms of memory usage.

*

* The function returns a sample size based on the constraints.

* Both size and minSideLength can be passed in as IImage.UNCONSTRAINED,

* which indicates no care of the corresponding constraint.

* The functions prefers returning a sample size that

* generates a smaller bitmap, unless minSideLength = IImage.UNCONSTRAINED.

*

* Also, the function rounds up the sample size to a power of 2 or multiple

* of 8 because BitmapFactory only honors sample size this way.

* For example, BitmapFactory downsamples an image by 2 even though the

* request is 3. So we round up the sample size to avoid OOM.

*/

private static int computeSampleSize(BitmapFactory.Options options,

int minSideLength, int maxNumOfPixels) {

int initialSize = computeInitialSampleSize(options, minSideLength,

maxNumOfPixels);

int roundedSize;

if (initialSize <= 8 ) {

roundedSize = 1;

while (roundedSize < initialSize) {

roundedSize <<= 1;

}

} else {

roundedSize = (initialSize + 7) / 8 * 8;

}

return roundedSize;

}

private static int computeInitialSampleSize(BitmapFactory.Options options,

int minSideLength, int maxNumOfPixels) {

double w = options.outWidth;

double h = options.outHeight;

int lowerBound = (maxNumOfPixels == UNCONSTRAINED) ? 1 :

(int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));

int upperBound = (minSideLength == UNCONSTRAINED) ? 128 :

(int) Math.min(Math.floor(w / minSideLength),

Math.floor(h / minSideLength));

if (upperBound < lowerBound) {

// return the larger one when there is no overlapping zone.

return lowerBound;

}

if ((maxNumOfPixels == UNCONSTRAINED) &&

(minSideLength == UNCONSTRAINED)) {

return 1;

} else if (minSideLength == UNCONSTRAINED) {

return lowerBound;

} else {

return upperBound;

}

}

/**

* Make a bitmap from a given Uri, minimal side length, and maximum number of pixels.

* The image data will be read from specified pfd if it's not null, otherwise

* a new input stream will be created using specified ContentResolver.

*

* Clients are allowed to pass their own BitmapFactory.Options used for bitmap decoding. A

* new BitmapFactory.Options will be created if options is null.

*/

private static Bitmap makeBitmap(int minSideLength, int maxNumOfPixels,

Uri uri, ContentResolver cr, ParcelFileDescriptor pfd,

BitmapFactory.Options options) {

Bitmap b = null;

try {

if (pfd == null) pfd = makeInputStream(uri, cr);

if (pfd == null) return null;

if (options == null) options = new BitmapFactory.Options();

FileDescriptor fd = pfd.getFileDescriptor();

options.inSampleSize = 1;

options.inJustDecodeBounds = true;

BitmapFactory.decodeFileDescriptor(fd, null, options);

if (options.mCancel || options.outWidth == -1

|| options.outHeight == -1) {

return null;

}

options.inSampleSize = computeSampleSize(

options, minSideLength, maxNumOfPixels);

options.inJustDecodeBounds = false;

options.inDither = false;

options.inPreferredConfig = Bitmap.Config.ARGB_8888;

b = BitmapFactory.decodeFileDescriptor(fd, null, options);

} catch (OutOfMemoryError ex) {

Log.e(TAG, "Got oom exception ", ex);

return null;

} finally {

closeSilently(pfd);

}

return b;

}

private static void closeSilently(ParcelFileDescriptor c) {

if (c == null) return;

try {

c.close();

} catch (Throwable t) {

// do nothing

}

}

private static ParcelFileDescriptor makeInputStream(

Uri uri, ContentResolver cr) {

try {

return cr.openFileDescriptor(uri, "r");

} catch (IOException ex) {

return null;

}

}

/**

* Transform source Bitmap to targeted width and height.

*/

private static Bitmap transform(Matrix scaler,

Bitmap source,

int targetWidth,

int targetHeight,

int options) {

boolean scaleUp = (options & OPTIONS_SCALE_UP) != 0;

boolean recycle = (options & OPTIONS_RECYCLE_INPUT) != 0;

int deltaX = source.getWidth() - targetWidth;

int deltaY = source.getHeight() - targetHeight;

if (!scaleUp && (deltaX < 0 || deltaY < 0)) {

/*

* In this case the bitmap is smaller, at least in one dimension,

* than the target. Transform it by placing as much of the image

* as possible into the target and leaving the top/bottom or

* left/right (or both) black.

*/

Bitmap b2 = Bitmap.createBitmap(targetWidth, targetHeight,

Bitmap.Config.ARGB_8888);

Canvas c = new Canvas(b2);

int deltaXHalf = Math.max(0, deltaX / 2);

int deltaYHalf = Math.max(0, deltaY / 2);

Rect src = new Rect(

deltaXHalf,

deltaYHalf,

deltaXHalf + Math.min(targetWidth, source.getWidth()),

deltaYHalf + Math.min(targetHeight, source.getHeight()));

int dstX = (targetWidth - src.width()) / 2;

int dstY = (targetHeight - src.height()) / 2;

Rect dst = new Rect(

dstX,

dstY,

targetWidth - dstX,

targetHeight - dstY);

c.drawBitmap(source, src, dst, null);

if (recycle) {

source.recycle();

}

c.setBitmap(null);

return b2;

}

float bitmapWidthF = source.getWidth();

float bitmapHeightF = source.getHeight();

float bitmapAspect = bitmapWidthF / bitmapHeightF;

float viewAspect = (float) targetWidth / targetHeight;

if (bitmapAspect > viewAspect) {

float scale = targetHeight / bitmapHeightF;

if (scale < .9F || scale > 1F) {

scaler.setScale(scale, scale);

} else {

scaler = null;

}

} else {

float scale = targetWidth / bitmapWidthF;

if (scale < .9F || scale > 1F) {

scaler.setScale(scale, scale);

} else {

scaler = null;

}

}

Bitmap b1;

if (scaler != null) {

// this is used for minithumb and crop, so we want to filter here.

b1 = Bitmap.createBitmap(source, 0, 0,

source.getWidth(), source.getHeight(), scaler, true);

} else {

b1 = source;

}

if (recycle && b1 != source) {

source.recycle();

}

int dx1 = Math.max(0, b1.getWidth() - targetWidth);

int dy1 = Math.max(0, b1.getHeight() - targetHeight);

Bitmap b2 = Bitmap.createBitmap(

b1,

dx1 / 2,

dy1 / 2,

targetWidth,

targetHeight);

if (b2 != b1) {

if (recycle || b1 != source) {

b1.recycle();

}

}

return b2;

}

/**

* SizedThumbnailBitmap contains the bitmap, which is downsampled either from

* the thumbnail in exif or the full image.

* mThumbnailData, mThumbnailWidth and mThumbnailHeight are set together only if mThumbnail

* is not null.

*

* The width/height of the sized bitmap may be different from mThumbnailWidth/mThumbnailHeight.

*/

private static class SizedThumbnailBitmap {

public byte[] mThumbnailData;

public Bitmap mBitmap;

public int mThumbnailWidth;

public int mThumbnailHeight;

}

/**

* Creates a bitmap by either downsampling from the thumbnail in EXIF or the full image.

* The functions returns a SizedThumbnailBitmap,

* which contains a downsampled bitmap and the thumbnail data in EXIF if exists.

*/

private static void createThumbnailFromEXIF(String filePath, int targetSize,

int maxPixels, SizedThumbnailBitmap sizedThumbBitmap) {

if (filePath == null) return;

ExifInterface exif = null;

byte [] thumbData = null;

try {

exif = new ExifInterface(filePath);

thumbData = exif.getThumbnail();

} catch (IOException ex) {

Log.w(TAG, ex);

}

BitmapFactory.Options fullOptions = new BitmapFactory.Options();

BitmapFactory.Options exifOptions = new BitmapFactory.Options();

int exifThumbWidth = 0;

int fullThumbWidth = 0;

// Compute exifThumbWidth.

if (thumbData != null) {

exifOptions.inJustDecodeBounds = true;

BitmapFactory.decodeByteArray(thumbData, 0, thumbData.length, exifOptions);

exifOptions.inSampleSize = computeSampleSize(exifOptions, targetSize, maxPixels);

exifThumbWidth = exifOptions.outWidth / exifOptions.inSampleSize;

}

// Compute fullThumbWidth.

fullOptions.inJustDecodeBounds = true;

BitmapFactory.decodeFile(filePath, fullOptions);

fullOptions.inSampleSize = computeSampleSize(fullOptions, targetSize, maxPixels);

fullThumbWidth = fullOptions.outWidth / fullOptions.inSampleSize;

// Choose the larger thumbnail as the returning sizedThumbBitmap.

if (thumbData != null && exifThumbWidth >= fullThumbWidth) {

int width = exifOptions.outWidth;

int height = exifOptions.outHeight;

exifOptions.inJustDecodeBounds = false;

sizedThumbBitmap.mBitmap = BitmapFactory.decodeByteArray(thumbData, 0,

thumbData.length, exifOptions);

if (sizedThumbBitmap.mBitmap != null) {

sizedThumbBitmap.mThumbnailData = thumbData;

sizedThumbBitmap.mThumbnailWidth = width;

sizedThumbBitmap.mThumbnailHeight = height;

}

} else {

fullOptions.inJustDecodeBounds = false;

sizedThumbBitmap.mBitmap = BitmapFactory.decodeFile(filePath, fullOptions);

}

}

}

====================================================================================

作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!

转载请保留原文地址:http://blog.csdn.net/ouyang_peng

===================================================================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息