精华内容
下载资源
问答
  • BitmapFactory

    2017-06-30 14:57:38
    BitmapFactory为了避免java.lang.OutOfMemory 的异常,我们需要在真正解析图片之前检查它的尺寸(除非你能确定这个数据源提供了准确无误的图片且不会导致占用过多的内存)。BitmapFactory.Options options = new ...

    BitmapFactory

    为了避免java.lang.OutOfMemory 的异常,我们需要在真正解析图片之前检查它的尺寸(除非你能确定这个数据源提供了准确无误的图片且不会导致占用过多的内存)。

    BitmapFactory.Options options = new BitmapFactory.Options();
    //设置 inJustDecodeBounds 属性为true可以在解码的时候避免内存的分配,它会返回一个null的Bitmap
    options.inJustDecodeBounds = true;
    //(decodeByteArray(), decodeFile(), decodeResource()等)是BitmapFactory提供的解码方法 根据不同的资源获取不同的解码方式
    BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
    //获取到 outWidth, outHeight 与 outMimeType。该技术可以允许你在构造Bitmap之前优先读图片的尺寸与类型。
    int imageHeight = options.outHeight;
    int imageWidth = options.outWidth;
    String imageType = options.outMimeType;
    

    通过上面的步骤我们已经获取到了图片的尺寸,这些数据可以用来帮助我们决定应该加载整个图片到内存中还是加载一个缩小的版本。有下面一些因素需要考虑:

    • 评估加载完整图片所需要耗费的内存。
    • 程序在加载这张图片时可能涉及到的其他内存需求。
    • 呈现这张图片的控件的尺寸大小。
    • 屏幕大小与当前设备的屏幕密度。

    例如,如果把一个大小为1024x768像素的图片显示到大小为128x96像素的ImageView上,就没有必要把整张原图都加载到内存中。

    下面的方法是用于查找图片的缩放比例:

    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;
        //如果图片的宽高 大于 需要的宽高  按比例缩小2阶的真是宽高
            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.
                //设置inSampleSize为2的幂是因为解码器最终还是会对非2的幂的数进行向下处理,获取到最靠近2的幂的数。
                while ((halfHeight / inSampleSize) > reqHeight
                && (halfWidth / inSampleSize) > reqWidth) {
                inSampleSize *= 2;
            }
        }
    
        return inSampleSize;
    }
    

    为了使用该方法,首先需要设置 inJustDecodeBounds 为 true, 把options的值传递过来,然后设置 inSampleSize 的值并设置 inJustDecodeBounds 为 false,之后重新调用相关的解码方法。

    public static Bitmap decodeSampledBitmapFromResource(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);
    }
    

    使用上面这个方法可以简单地加载一张任意大小的图片。如下面的代码样例显示了一个接近 100x100像素的缩略图:

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

    我们可以通过替换合适的BitmapFactory.decode* 方法来实现一个类似的方法,从其他的数据源解析Bitmap。

    展开全文
  • Android BitmapFactory

    2017-03-17 19:10:00
    android BitmapFactory BitmapFactory是一个工具类,用于从不同数据源解析,创建Bitmap对象。bitmap类代表位图。 BitmapFactory常用方法 static Bitmap decodeFile(String pathName) 从指定文件中解析,创建Bitmap...

    android BitmapFactory

    BitmapFactory是一个工具类,用于从不同数据源解析,创建Bitmap对象。bitmap类代表位图。

    BitmapFactory常用方法

    static Bitmap decodeFile(String pathName)

    从指定文件中解析,创建Bitmap对象。

    static Bitmap decodeStream(Inputstream is)

    从指定输入流中解析、创建Bitmap对象。

    static Bitmap decodeResource(Resources res, int id)

    根据给定的资源id,解析创建Bitmap对象。

    使用方法如下:

    Example

    使用BitmapFactory.decodeResource()创建Bitmap对象。

    再使用ImageView的setImageBitmap()在ImageView中显示。

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.imagetest.MainActivity">
    
        <ImageView
            android:id="@+id/imageViewPicture"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </RelativeLayout>

    MainActivity.java

    package com.example.imagetest;
    
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.ImageView;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pic);    //pic.png位于drawable目录
    
            ImageView imgView = (ImageView) findViewById(R.id.imageViewPicture);
            imgView.setImageBitmap(bitmap);
        }
    }

    Tony Liu

    2017-3-17, Shenzhen

    展开全文
  • BitmapFactory

    2016-07-24 13:49:15
    在Android中,提供的BitmapFactory类,该类为一个工具类,用于从不同的数据源解析、创建Bitmap对象,BitmapFactory类提供的创建的Bitmap对象,提供了如下方法:;">static Bitmap decodeByteArray(byte[] data, int ...

    在Android中,提供的BitmapFactory类,该类为一个工具类,用于从不同的数据源解析、创建Bitmap对象,BitmapFactory类提供的创建的Bitmap对象,提供了如下方法:

    <span style="font-size:18px;">static Bitmap    decodeByteArray(byte[] data, int offset, int length, BitmapFactory.Options opts)  
    Decode an immutable bitmap from the specified byte array.  
    static Bitmap    decodeByteArray(byte[] data, int offset, int length)  
    Decode an immutable bitmap from the specified byte array.  
    static Bitmap    decodeFile(String pathName)  
    Decode a file path into a bitmap.  
    static Bitmap    decodeFile(String pathName, BitmapFactory.Options opts)  
    Decode a file path into a bitmap.  
    static Bitmap    decodeFileDescriptor(FileDescriptor fd)  
    Decode a bitmap from the file descriptor.  
    static Bitmap    decodeFileDescriptor(FileDescriptor fd, Rect outPadding, BitmapFactory.Options opts)  
    Decode a bitmap from the file descriptor.  
    static Bitmap    decodeResource(Resources res, int id, BitmapFactory.Options opts)  
    Synonym for opening the given resource and calling decodeResourceStream(Resources, TypedValue, InputStream, Rect, BitmapFactory.Options).  
    static Bitmap    decodeResource(Resources res, int id)  
    Synonym for decodeResource(Resources, int, android.graphics.BitmapFactory.Options) with null Options.  
    static Bitmap    decodeResourceStream(Resources res, TypedValue value, InputStream is, Rect pad, BitmapFactory.Options opts)  
    Decode a new Bitmap from an InputStream.  
    static Bitmap    decodeStream(InputStream is)  
    Decode an input stream into a bitmap.  
    static Bitmap    decodeStream(InputStream is, Rect outPadding, BitmapFactory.Options opts)  
    Decode an input stream into a bitmap.</span>  

    写得很清楚,总结一下:
    主要解析来源有四个:byteArray、File、Resource、InputStream
    (1)byteArray:

    static Bitmap  decodeByteArray(byte[] data, int offset, int length, BitmapFactory.Options opts) //从byteArray中offset开始长度为length的位置解析,解析属性有opts  
    static Bitmap    decodeByteArray(byte[] data, int offset, int length)   //从byteArray中offset开始长度为length的位置解析

    (2)File:

    static Bitmap decodeFile(String pathName)  
    static Bitmap decodeFile(String pathName, BitmapFactory.Options opts)  
    static Bitmap decodeFileDescriptor(FileDescriptor fd)   
    static Bitmap  decodeFileDescriptor(FileDescriptor fd, Rect outPadding, BitmapFactory.Options opts)  

    主要有两种:decodeFile和decodeFileDescriptor,decodeFileDescriptor()更省内存
    原因:查看BitmapFactory的源码,对比一下两者的实现,可以发现decodeFile()最终是以流的方式生成bitmap,decodeFileDescriptor的源码,可以找到native本地方法decodeFileDescriptor,通过底层生成bitmap
    (3)Resource
    解析Drawable资源中保存的图片文件并创建对应的Bitmap对象

    static Bitmap decodeResource(Resources res, int id, BitmapFactory.Options opts)  
    //Synonym for opening the given resource and calling //decodeResourceStream(Resources, TypedValue, InputStream, Rect, //BitmapFactory.Options).  
    static Bitmap decodeResource(Resources res, int id)  
    //Synonym for decodeResource(Resources, int, //android.graphics.BitmapFactory.Options) with null Options.  
    static Bitmap decodeResourceStream(Resources res, TypedValue value, InputStream is, Rect pad, BitmapFactory.Options opts) 

    (4)InputStream

    static Bitmap    decodeStream(InputStream is)  
    static Bitmap    decodeStream(InputStream is, Rect outPadding, BitmapFactory.Options opts)  

    以看到此工具类非常方便,但是加载和显示图片是很消耗内存的一件事,BitmapFactory.Options 类允许我们定义图片以何种方式如何读到内存。
    inJustDecodeBounds:如果值设为true,那么将不返回实际的bitmap,也不给其分配内存空间,这样就避免了内存溢出。但是允许我们查询图片的信息,这其中就包括图片的大小信息(options.outHeight(图片的原始高度)和
    options.outWidth(图片的原始宽度))。
    inSampleSize:我们可以充分利用它,实现缩放。如果设置为>1,要求解码器解码出原始图片的一个子样本,返回
    一个较小的bitmap,以节省空间。例如,inSampleSize==2,则取出的缩略图的宽和高都是原始图片的1/2,图片的大
    小就是原始图片的1/4。对于任何值<=1的同样处置为1.
    如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin">
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tv_1"
            android:text="Hello World!" />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/tv_2"
            android:text="hello"/>
    
    </LinearLayout>
    package com.example.administrator.bitmap;
    
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
        private TextView tv_1,tv_2;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tv_1= (TextView) findViewById(R.id.tv_1);
            tv_2= (TextView) findViewById(R.id.tv_2);
            decode();
        }
        public void decode(){
            BitmapFactory.Options options=new BitmapFactory.Options();
            options.inJustDecodeBounds=true;
            Bitmap bitmap=BitmapFactory.decodeResource(MainActivity.this.getResources(),R.mipmap.ic_launcher,options);
            if(bitmap==null){
                Toast.makeText(MainActivity.this,"bitmap为空",Toast.LENGTH_SHORT);
            }
            int realWidth=options.outWidth;
            int realHeight=options.outHeight;
            tv_1.setText("图片真实宽度为"+realWidth+"图片真实高度为"+realHeight);
    
            int scal=((realHeight>realWidth?realWidth:realHeight)/100);
          //  if(scal<=0){
          //      scal=1;
           // }
            scal=2;
            options.inSampleSize=scal;// 进行scal比例的缩放
    
            options.inJustDecodeBounds=false;
            bitmap=BitmapFactory.decodeResource(MainActivity.this.getResources(),R.mipmap.ic_launcher,options);
            if(bitmap==null){
                Toast.makeText(MainActivity.this,"bitmap为空2",Toast.LENGTH_SHORT).show();
            }
            tv_2.setText("图片缩略图高度"+bitmap.getHeight()+"宽度"+bitmap.getWidth());
        }
    }
    
    展开全文
  • BitmapFactory.Options

    千次阅读 2016-08-23 11:10:44
    加载和显示图片是很消耗内存的一件事,BitmapFactory.Options 类, 允许我们定义图片以何种方式如何读到内存, [java] view plain copy BitmapFactory.Options bmpFactoryOptions = ...

    加载和显示图片是很消耗内存的一件事,BitmapFactory.Options 类,  允许我们定义图片以何种方式如何读到内存,

    [java] view plain copy
    1. BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();  
    2. bmpFactoryOptions.inSampleSize = 8;  
    3. Bitmap bmp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);  
    4. imv.setImageBitmap(bmp);  

    上面的代码使图片变成原来的1/8.


    [java] view plain copy
    1. //imv = (ImageView) findViewById(R.id.ReturnedImageView);  
    2.         Display currentDisplay = getWindowManager().getDefaultDisplay();  
    3.         int dw = currentDisplay.getWidth();  
    4.         int dh = currentDisplay.getHeight();  
    5.           try  
    6.        {  
    7.         BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();  
    8.         bmpFactoryOptions.inJustDecodeBounds = true;  
    9.         Bitmap bmp = BitmapFactory.decodeStream(getContentResolver().  
    10.                 openInputStream(imageFileUri), null,  bmpFactoryOptions);  
    11.   
    12.         int heightRatio = (int)Math.ceil(bmpFactoryOptions.outHeight/(float)dh);  
    13.         int widthRatio = (int)Math.ceil(bmpFactoryOptions.outWidth/(float)dw);  
    14.   
    15.         Log.v("HEIGHRATIO"""+heightRatio);  
    16.         Log.v("WIDTHRATIO"""+widthRatio);  
    17.   
    18.         if (heightRatio > 1 && widthRatio > 1)  
    19.         {  
    20.             bmpFactoryOptions.inSampleSize =  heightRatio > widthRatio ? heightRatio:widthRatio;  
    21.         }  
    22.         bmpFactoryOptions.inJustDecodeBounds = false;  
    23.         bmp = BitmapFactory.decodeStream(getContentResolver().  
    24.                 openInputStream(imageFileUri), null,  bmpFactoryOptions);  
    25.            returnedImageView.setImageBitmap(bmp);  
    26.        }  
    27.        catch (FileNotFoundException e)  
    28.        {  
    29.            Log.v("ERROR", e.toString());  
    30.   
    31.        }  


    上面的代码让图片根据窗口大小改变
    [java] view plain copy
    1. bmpFactoryOptions.inJustDecodeBounds = true;  

    这一行让代码只解码图片的Bounds

    本文转载http://blog.csdn.net/ruiyiin/article/details/8675361

    展开全文
  • 12.3 BitmapFactory详解

    2020-03-15 15:14:06
    Bitmap基本概念: 1.bitmap是Android系统中的图像处理的重要类之一; 2.通过bitmap我们可以获取到图片的相关...1.BitmapFactory.decodeBetyArray();//字节数组 2.BitmapFactory.decodeFile();//文件路径 3.BitmapFac...
  • BitmapFactory.decodeResource

    2019-10-07 02:08:56
    BitmapFactory.decodeResource()是加载图形资源的重要方法。 可加载工程目录中的drawable文件夹下的图片资源,还可以加载网上的图片资源。 BitmapFactory.decodeResource(?,?)这个带两个参数的方法: 第一...
  • OutOfMemory BitmapFactory

    2020-12-27 09:31:18
    android.graphics.BitmapFactory.nativeDecodeAsset (BitmapFactory.java) android.graphics.BitmapFactory.decodeStream (BitmapFactory.java:595) android.graphics.BitmapFactory.decodeResourceStream ...
  • BitmapFactory 简单 使用

    千次阅读 2018-11-20 10:19:13
    BitmapFactory 1,介绍:   从各种来源创建位图对象(包括文件、流和字节数组.) 2,常用方法:    3,图片查看器demo: 【1】布局 【2】代码:  a.获取ID 创建click 利用HttpURLConnection请求...
  • 主要为大家详细介绍了android BitmapFactory.Options使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • BitmapFactory 简介

    2013-10-16 21:55:57
    BitmapFactory 这个类介绍  创建图片对象可以来自于文件、数组数组和流。
  • BitmapFactory之Options

    2019-01-07 09:25:00
    package com.loaderman.customviewdemo; import android.app.Activity; import android.graphics.Bitmap; ...import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Environme...
  • BitMap,BitMapFactory,android 主要为了处理图片,分享下
  • BitmapFactory 使用小记

    2017-07-29 15:18:26
    BitmapFactory 使用BitmapFactory.decodeResource(getResources(),R.drawable.ic_q3_cover); 所创建的Bitmap是不可变的. 就是无法使用该Bitmap创建画布进行绘制. 解决办法,使用copy方法,创建可变副本 示例 ...
  • BitmapFactory.Options 详解

    2019-01-23 10:58:49
    BitmapFactory.Options public static class BitmapFactory.Options  extends Object  java.lang.Object继承  ↳ android.graphics.BitmapFactory.Options   摘要 ...
  • BitmapFactory.Options详解

    2019-10-03 07:34:02
    在通过BitmapFactory.decodeFile(String path)方法将突破转成Bitmap时,遇到大一些的图片,我们经常会遇到OOM(Out Of Memory)的问题。怎么避免它呢? 这就用到了我们上面提到的BitmapFactory.Options这个类。 ...
  • BitmapFactory的用法

    2016-08-11 17:10:17
    BitmapFactory用以下两个方法,分别为: BitmapFactory.decodeResource(?,?)这个带两个参数的方法:第一个参数是包含你要加载的位图资源文件的对象(一般写成 getResources()就ok了);第二个时你需要加载的...
  • 换了新手机,照片4800万像素,BitmapFactory.decodeFile 溢出崩溃,看看别人是怎么解决的。 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; //开启只读取尺寸...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,719
精华内容 2,687
关键字:

bitmapfactory