• (1)BitmapFactory类相关


    (1)常用的四个decode函数的使用

    public static Bitmap decodeResource(Resources res, int id, Options opts):图片保存在res/drawable-xxx文件夹时,使用该函数

    public static Bitmap decodeFile(String pathName, Options opts):图片源已知是绝对路径时使用该函数

    public static Bitmap decodeFileDescriptor(FileDescriptor fd, Rect outPadding, Options opts):图片源已知是数据库源uri时可使用该函数

    ParcelFileDescriptor pfd = context.getContentResolver()
    		.openFileDescriptor(sourceUri, "r");
    FileDescriptor fd = null;
    Bitmap bitmap = null;
    if (pfd != null) {
    	fd = pfd.getFileDescriptor();
    }
    try {
    	if (fd != null) {
    		bitmap = BitmapFactory.decodeFileDescriptor(fd, null, options);
    	}
    } catch (OutOfMemoryError e) {
    

    public static Bitmap decodeStream(InputStream is, Rect outPadding, Options opts):图片源已知是数据库源uri时可使用该函数

    InputStream is = null;
    try {
    	is = mContext.getContentResolver().openInputStream(uri);
    	BitmapFactory.decodeStream(is, null, o);
    

     说明:

    1.第一个函数可以在UI线程中直接使用,后三个函数必须使用异步线程。后两个函数有何区别,暂时不明,测试二者所花时间差不多。

    2.outPadding一般置为null,如果图片源的bitmap有边界,可以通过该参数获取一个Rect边界对象。

    (2)避免OutOfMemoryError

    如果允许在一定条件下对原图进行采样可以很好的规避此问题,同时可以得到不为空的bitmap进行下一步处理。

    ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(sourceUri, "r");
    FileDescriptor fd = null;
    Bitmap bitmap = null;
    if (pfd != null) {
    	fd = pfd.getFileDescriptor();
    }
    try {
    	if (fd != null) {
    		bitmap = BitmapFactory.decodeFileDescriptor(fd, null, options);
    	}
    } catch (OutOfMemoryError e) {
    	// / M: As there is a chance no enough dvm memory for decoded
    	// Bitmap,
    	// Skia will return a null Bitmap. In this case, we have to
    	// downscale the decoded Bitmap by increase the options.inSampleSize
    	final int maxTryNum = 8;
    	for (int i = 0; i < maxTryNum; i++) {
    		// we increase inSampleSize to expect a smaller Bitamp
    		options.inSampleSize *= 2;
    		try {
    			bitmap = BitmapFactory.decodeFileDescriptor(fd, null,
    					options);
    		} catch (OutOfMemoryError e1) {
    			Log.w(LOGTAG, "  saveBitmap :out of memory when decoding:"
    					+ e1);
    			bitmap = null;
    		}
    		if (bitmap != null)
    			break;
    	}
    } finally {
    	if (pfd != null) {
    		Utils.closeSilently(pfd);
    	}
    }
    

     (3)不耗时获取图片源的宽和高数据。使用如下方式decode不会把数据读取到内存,从而不耗时。

    InputStream isStream =  mContext.getContentResolver().openInputStream(uri);
    BitmapFactory.Options opt = new BitmapFactory.Options();
    opt.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(isStream, null, opt);
    photoWidth = opt.outWidth;
    photoHeight = opt.outHeight;

    (4)BitmapFactory.Options常用相关属性

     public Bitmap.Config inPreferredConfig:默认值为Bitmap.Config.ARGB_8888;

     public int inSampleSize:采样率,必须是2的指数值。

     public boolean inJustDecodeBounds

  • 相关阅读:
    第八节 JS运动基础
    第七节 DOM操作应用-高级
    第六节 DOM操作应用
    第五讲 DOM基础
    第二节 数学基础与语言学基础
    第一节 自然语言处理概论
    第0节 课程简述
    第四节 定时器
    基本概念
    常用命令
  • 原文地址:https://www.cnblogs.com/fordreamxin/p/4596151.html
Copyright © 2020-2023  润新知