精华内容
下载资源
问答
  • 安卓 Bitmap 高效加载

    2016-02-23 20:20:55
    安卓 Bitmap 高效加载

    博客: 安卓之家
    微博: 追风917
    CSDN: 蒋朋的家
    简书: 追风917

    理论


    Bitmap 的高效加载会利用 BitmapFactory.Options 来加载所需尺寸的图片,也就是可以按一定的采样率来加载所需图片(一般就是缩小后的图片)。采样率的设置就是 BitmapFactory.Options 的inSampleSize 参数。

    • inSampleSize 小于1时,无缩放效果,相当于 inSampleSize = 1;
    • inSampleSize 为1时,采样后图片为原始图片大小
    • inSampleSize 为2时,采样后图片的宽高均为原始图片的一半,那么像素值为原始图片的1/4, 占内存大小也是原图的1/4,也就是说缩放比例是 1/(inSampleSize 的2次方),比如inSampleSize 为 4, 缩放比例就是 1/16
    • 最新官方文档指出,inSampleSize 的取值应该是2的指数,比如1,2,4,8,16…如果inSampleSize不为2的指数,会向下取整选择一个最接近的2的指数来代替,比如3,系统会选择2来代替,但是验证发现该结论并非所有的安卓系统版本都成立,因此这只是一个开发建议咯。

    步骤


    1. 把 BitmapFactory.Options 的inJustDecodeBounds 参数设置为 true,此时BitmapFactory 只会解析原始图片的宽高信息,不会真正加载图片
    2. 从 BitmapFactory.Options 中取出图片宽高信息,它们对应于outWidth 和 outHeight 参数
    3. 根据采样率的规则并结合目标View所需大小计算采样率 inSampleSize
    4. 把 BitmapFactory.Options 的inJustDecodeBounds 参数设置为 false, 重新加载图片

    具体代码实现


    计算分辨率

    public static int calculateInSampleSize( 
                BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // Raw height and width of image 
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
    
        if (height > reqHeight || width > reqWidth) {
            final int halfHeight = height / 2;
            final int halfWidth = width / 2;
    
            // Calculate the largest inSampleSize value that is a power of 2 and keeps both 
            // height and width larger than the requested height and width. 
            while ((halfHeight / inSampleSize) > reqHeight
                    && (halfWidth / inSampleSize) > reqWidth) {
                inSampleSize *= 2;
            } 
        } 
    
        return inSampleSize;
    } 

    加载图片

    public static Bitmap decodeBitmapFromResource(Resources res, int resId,
            int reqWidth, int reqHeight) {
    
        // First decode with inJustDecodeBounds=true to check dimensions 
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, resId, options);
    
        // Calculate inSampleSize 
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
    
        // Decode bitmap with inSampleSize set 
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeResource(res, resId, options);
    } 

    我写到了这个 Gist

    使用


    mImageView.setImageBitmap(
        decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100));

    参考内容:
    任书记的《Android 开发艺术探索》第 12 章
    google开发指南

    分享是一种美德,更是一种生活方式!!

    也许你会说我是一个梦想者,但我不是唯一的一个。

    悦分享,越快乐^_^

    欢迎交流,转载请注明出处,谢谢!

    展开全文
  • 安卓bitmap图片编码是带"\r\n" 换行符的Mime编码器转换的 所以Java服务端转换是也需要使用mime编码转换 如byte[] buffer; buffer = Base64.getMimeDecoder().decode(image);// 对APP传过来的图片字符串进行解码

    安卓bitmap图片编码是带"\r\n" 换行符的Mime编码器转换的

    所以Java服务端转换是也需要使用mime编码转换

    byte[] buffer;
    buffer = Base64.getMimeDecoder().decode(image);// 对APP传过来的图片字符串进行解码


    展开全文
  • 安卓 bitmap绘图

    2016-02-19 20:46:53
    Bitmap bitmap1, bitmap2; BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inSampleSize = 1; bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.ic_ca
            Bitmap bitmap1, bitmap2;
            BitmapFactory.Options opts = new BitmapFactory.Options();
            opts.inSampleSize = 1;
            bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.ic_callphone, opts);
            bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.ic_sms, opts);
            call.setImageBitmap(bitmap1);
            sms.setImageBitmap(bitmap2);

    PS:用完之后要回收!!

        @Override
        public void onDestroy()
        {
            bitmap1.recycle();
            bitmap2.recycle();
            super.onDestroy();
        }

    但是不能立即回收,不然会出现如下错误:

     java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Bitmap.recycle()' on a null object reference

    不要在xml界面中设置过大图片(大于20kb)
    不要直接使用setImageResource方法,不然会有二进制文件错误问题,而且不方便错误定位。

    //勿使用setImageResource方法 不然会有二进制文件错误问题
     head_right.setImageDrawable(getResources().getDrawable(R.drawable.me_details_check));

    Activity中的Bitmap对象,如果是成员变量,需要在onDestroy()中明确释放。 因为,即使在Activity调用Finish()结束后,虚拟机都不会立即回收Bitmap的内存(什么时候回收不得 而知),所以如一个Activity 中会创建一个很大的Bitmap,在Activiy结束后没有明确释放,多次调用 这个Activity后,容易发生内存溢出错误。(此段转载:http://www.cnblogs.com/shao-jian/archive/2012/09/10/2678440.html

    展开全文
  • 安卓 Bitmap基本使用

    2015-03-23 21:03:53
    //讲一个Bitmap对象封装成BitmapDrawable 对象 bitmapDrawable drawable = new BitmapDrawable(bitmap); //获取bitmap对象 Bitmap bitmap = drawable.getBitmap(); ImageView image = new ImageView(this); ...
    //讲一个Bitmap对象封装成BitmapDrawable 对象
    bitmapDrawable drawable = new BitmapDrawable(bitmap);
    
    
    //获取bitmap对象
    Bitmap bitmap = drawable.getBitmap();
    ImageView image = new ImageView(this);
    ImputStream assetFile = assets.open(images[currentImg++])
    image.setImageBitmap(BitmapFactory.decodeStream(file));

    展开全文
  • 安卓Bitmap处理

    2013-09-15 16:28:30
    2.加载到内存中的图片,bitmap对象再compress回到文件的时候会多出很多信息。无用的。 内存溢出处理办法: a.现将图片信息(height,width)在不耗费内存资源的情况下读取出来。 BitmapFactory.Options op
  • 安卓Bitmap读取图片

    2015-07-15 16:39:27
    1.以文件流的方式,假设在sdcard下有 test.png图片 FileInputStream fis = new FileInputStream("/sdcard/test.png"); Bitmap bitmap=BitmapFactory.decodeStream...res/drawable下有 test.jpg文件Bitmapbitmap
  • android/bitmap.h> 库依赖:CMakeLists.txt里需要添加jnigraphics库的依赖: target_link_libraries(${MY_LIBRARY_NAME} jnigraphics ... 2.主要方法介绍 2.1 AndroidBitmap_getInfo: 功能:获取Bitmap...
  • 我现在做的一个APP,需要从本地存储,创建很多Bitmap,现在发生了内存溢出的问题,而图片尺寸和质量能调整的范围有限,而回收Bitmap还不行,我的程序需要一直运行,并在集合中保留这些Bitmap,请问有什么办法解决这...
  • 安卓 bitmap生成缩略图

    2017-12-29 11:38:26
    /** * 生成缩略图 * 缩略图是将原图等比压缩,压缩后宽、高中较小的一个等于198像素 ... private Bitmap getThumb(String path){ final BitmapFactory.Options options = new BitmapFactory.Options(); options.i
  • 安卓加载一张图片的大小并不是你到资源文件图片大小,比如下图我保存在资源文件图片17.93kb,但是代码直接加载图片,图片占空间为300ky明显比资源图片大很多 //加载图片代码 private ImageView iv, iv2; private ...
  • 代码如图,我想用gallery显示bitmap出来,可是显示的图片都是一样的,为什么呢,如果说是bitmap内存没释放,我用recyle方法时候程序会闪退。求解答![图片]...
  • Bitmap pic = null; int width = 640; //设定宽度 try { BitmapFactory.Options options = new BitmapFactory.Options(); //得到的宽高,并不真正解码后的图片 options.inJustDecod
  • 安卓Bitmap图像格式转为BGRA

    千次阅读 2014-11-07 16:03:52
    最近在做opencv的一个项目,安卓人脸识别。
  • public static void saveImageToGallery(Context context, Bitmap bmp) { // 首先保存图片 File appDir = new File(Environment.getExternalStorageDirectory(), "Boohee"); if (!appDir.exists()) {
  • Bitmap bm = BitmapFactory.decodeFile(m.group()); Bitmap rbm = resizeImage(bm, 100, 100); ImageSpan span = new ImageSpan(this, rbm); ss.setSpan(span, m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_...
  • 做个拼图游戏,最后的成功判断,我的想法是在一个ImageView里读出那个Bitmap跟现有的进行比较如果两个Bitmap是同一个那就成功。可是貌似两个Bitmap类型不能比较,还是我放的语句位置不对。
  • Bitmap temp = Bitmap .createBitmap(myBitmap, 0, 0, myBitmap.getWidth(), myBitmap.getHeight(), matrix, true); myBitmap = temp; mContent = CameraDlg.Bitmap2Bytes(myBitmap);...
  • 安卓-BitMap缩放

    2014-12-30 11:20:23
    安卓-BitMap缩放
  • Bitmap convert(Bitmap a, int width, int height){int w = a.getWidth();int h = a.getHeight();Bitmap newb = Bitmap.createBitmap(ww, wh, Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图 Canvas cv ...
  • 安卓保存bitmap到本地

    千次阅读 2018-01-26 12:16:03
    在用picasso的时候,想把获取的的bitmap保存到本地: Picasso.with(getActivity()).load(imgUrls.get(position)).into(new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.Loa...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 860
精华内容 344
关键字:

安卓bitmap