zoukankan      html  css  js  c++  java
  • (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

  • 相关阅读:
    -1.#IND000 &&图像类型转换
    三维点集拟合:平面拟合、RANSAC、ICP算法
    深度学习:又一次推动AI梦想(Marr理论、语义鸿沟、视觉神经网络、神经形态学)
    三维重建:Kinect几何映射-SDK景深数据处理
    《SLIC Superpixels》阅读笔记
    中国企业系列
    关于抠图的一些文章方法收集
    数学空间引论
    PCL:解决PCL和OpenCV冲突的方法
    游戏开发:OpenGL入门学习
  • 原文地址:https://www.cnblogs.com/fordreamxin/p/4596151.html
Copyright © 2011-2022 走看看