public static class BitmapFactory.Options
extends Object
| java.lang.Object | |
| android.graphics.BitmapFactory.Options | |
Fields |
|
|---|---|
public Bitmap |
inBitmap 如果设置,则在加载内容时,采用Options对象的解码方法将尝试重新使用此位图。 |
public int |
inDensity 用于位图的像素密度。 |
public boolean |
inDither |
public boolean |
inInputShareable 该字段在API级别21中已被弃用。从 |
public boolean |
inJustDecodeBounds 如果设置为true,解码器将返回空(无位图),但出... |
public boolean |
inMutable 如果设置,解码方法将始终返回一个可变的位图而不是不可变的位图。 |
public boolean |
inPreferQualityOverSpeed 该字段在API级别24中已被弃用。从 |
public Bitmap.Config |
inPreferredConfig 如果这是非空的,则解码器将尝试解码为该内部配置。 |
public boolean |
inPremultiplied 如果为true(这是默认值),则生成的位图的颜色通道将由alpha通道预先倍增。 |
public boolean |
inPurgeable 该字段在API级别21中已被弃用。从 为了进行重新解码,位图必须能够访问编码数据,或者通过共享对输入的引用或复制它。 这个区别由inInputShareable控制。 如果这是真的,那么位图可以保持对输入的浅参考。 如果这是错误的,那么位图将显式地复制输入数据,并保留它。 即使允许共享,实现仍可能决定对输入数据进行深层复制。 虽然inPurgeable可以帮助避免大Dalvik堆分配(从API级别11开始),但它牺牲了性能可预测性,因为视图系统尝试绘制的任何图像都可能导致解码延迟,从而导致丢帧。 因此,大多数应用程序应该避免使用inPurgeable来实现快速流畅的用户界面。 为了最小化Dalvik堆分配,请改用 注意:与 |
public int |
inSampleSize 如果设置为大于1的值,则请求解码器对原始图像进行二次采样,返回较小的图像以节省存储空间。 |
public boolean |
inScaled 设置此标志时,如果 |
public int |
inScreenDensity 正在使用的实际屏幕的像素密度。 |
public int |
inTargetDensity 该位图的目标的像素密度将被绘制到。 |
public byte[] |
inTempStorage 临时存储用于解码。 |
public boolean |
mCancel 此字段在API级别24中已弃用。从 |
public int |
outHeight 由此产生的位图高度。 |
public String |
outMimeType 如果已知,则将该字符串设置为解码图像的mimetype。 |
public int |
outWidth 由此产生的位图宽度。 |
Public constructors |
|
|---|---|
BitmapFactory.Options() 创建一个默认的Options对象,如果保持不变,将会给解码器提供相同的结果,就像null传递一样。 |
|
公共方法(Public methods) |
|
|---|---|
void |
requestCancelDecode() 此方法在API级别24中已弃用。从 |
继承方法(Inherited methods) |
|
|---|---|
java.lang.Object
|
|
Bitmap inBitmap
如果设置,则在加载内容时,采用Options对象的解码方法将尝试重新使用此位图。 如果解码操作无法使用此位图,则解码方法将返回null ,并将引发IllegalArgumentException。 当前的实现需要重用的位图是可变的,并且即使解码通常会导致不可变的位图的资源,所得到的重用位图也将继续保持可变。
由于上面列出的约束和可能发生的故障情况,您仍应始终使用解码方法的返回位图,并且不要认为重用了位图。 检查返回值是否与Options结构中设置的inBitmap的值相匹配,将指示位图是否被重用,但是在所有情况下,应使用解码函数返回的位图来确保您使用的位图用作解码目的地。
作为KITKAT ,任何可变的位图可以通过重复使用BitmapFactory到只要任何其它的位图进行解码所得到的byte count解码的位图的是小于或等于allocated byte count重用位图。 这可能是因为固有尺寸较小,或尺寸缩放后(密度/样本尺寸)较小。
在KITKAT之前, KITKAT其他限制条件:正在解码的图像(无论是作为资源还是作为流)必须采用jpeg或png格式。 只支持相同大小的位图,并且inSampleSize设置为1.此外,如果设置,则重用位图的configuration将覆盖设置inPreferredConfig 。
BitmapRegionDecoder会将其请求的内容绘制到所提供的位图中,如果输出内容大小(缩放后)大于提供的位图,则进行裁剪。 提供的位图的宽度,高度和Bitmap.Config将不会更改。
在inBitmap中引入了JELLY_BEAN BitmapRegionDecoder支持。 所有格式通过由BitmapRegionDecoder支持位图重用支持inBitmap 。
int inDensity
用于位图的像素密度。 这将始终导致返回的位图具有为其设置的密度(请参阅Bitmap.setDensity(int) )。 另外,如果设置了inScaled (默认情况下),并且此密度与inTargetDensity不匹配,则在返回之前,位图将缩放为目标密度。
如果这是0, decodeResource(Resources, int) decodeResource(Resources, int, android.graphics.BitmapFactory.Options)和decodeResourceStream(Resources, TypedValue, InputStream, Rect, BitmapFactory.Options)将填充与资源关联的密度。 其他功能将保持原样并且不会应用密度。
boolean inInputShareable
此字段在API级别21中已被弃用。
截至LOLLIPOP ,这被忽略。 在KITKAT及以下,该字段与inPurgeable结合使用。 如果inPurgeable为false,则该字段将被忽略。 如果inPurgeable为true,那么此字段确定位图是否可以共享对输入数据(输入流,数组等)的引用,或者是否必须进行深度复制。
boolean inJustDecodeBounds
如果设置为true,解码器将返回null(无位图),但out ...字段仍将被设置,允许调用者查询位图而不必为其像素分配内存。
boolean inMutable
如果设置,解码方法将始终返回一个可变的位图而不是不可变的位图。 这可以用于例如以编程方式将效果应用于通过BitmapFactory加载的位图。
boolean inPreferQualityOverSpeed
此字段在API级别24中已被弃用。
截至N ,这被忽略。 输出将始终是高质量的。 在M及以下版本中,如果inPreferQualityOverSpeed设置为true,则解码器将尝试将重构图像解码为更高质量,即使牺牲解码速度。 目前该领域只影响JPEG解码,在这种情况下,将使用更精确但速度稍慢的IDCT方法。
Bitmap.Config inPreferredConfig
如果这是非空的,则解码器将尝试解码为该内部配置。 如果它为空,或者请求不能满足,解码器将尝试根据系统的屏幕深度和原始图像的特征(例如它是否具有每个像素的alpha)选择最匹配的配置(需要配置一样)。 图像默认加载了ARGB_8888配置。
boolean inPremultiplied
如果为true(这是默认值),则生成的位图的颜色通道将由alpha通道预先倍增。
对于由视图系统或通过Canvas直接绘制的图像,这不应设置为false。 视图系统和Canvas假定所有绘制的图像都是预乘以简化绘制时间混合,并且在绘制未预乘积时将抛出RuntimeException。
如果您想操作原始编码的图像数据,例如使用RenderScript或自定义OpenGL,这可能只会有用。
这不会影响没有Alpha通道的位图。
将 inScaled设置为true时将此标志设置为false可能会导致不正确的颜色。
也可以看看:
boolean inPurgeable
此字段在API级别21中已被弃用。
截至LOLLIPOP ,这被忽略。 在KITKAT及以下版本中,如果设置为true,则生成的位图将分配其像素,以便在系统需要回收内存时清除它们。 在这种情况下,当像素需要再次访问时(例如绘制位图,调用getPixels()),它们将自动重新解码。
为了进行重新解码,位图必须能够访问编码数据,或者通过共享对输入的引用或复制它。 这个区别由inInputShareable控制。 如果这是真的,那么位图可以保持对输入的浅参考。 如果这是错误的,那么位图将显式地复制输入数据,并保留它。 即使允许共享,实现仍可能决定对输入数据进行深层复制。
虽然inPurgeable可以帮助避免大Dalvik堆分配(从API级别11开始),但它牺牲了性能可预测性,因为视图系统尝试绘制的任何图像都可能导致解码延迟,从而导致丢帧。 因此,大多数应用程序应该避免使用inPurgeable来实现快速流畅的用户界面。 为了尽量减少Dalvik堆分配,请改用inBitmap标志。
注意:与 decodeResource(Resources, int, android.graphics.BitmapFactory.Options)或 decodeFile(String, android.graphics.BitmapFactory.Options)一起使用时,该标志被忽略。
int inSampleSize
如果设置为大于1的值,则请求解码器对原始图像进行二次采样,返回较小的图像以节省存储空间。 样本大小是任一维度中与解码位图中的单个像素对应的像素数量。 例如,inSampleSize == 4返回的图像是原始宽度/高度的1/4,以及像素数量的1/16。 任何值<= 1的处理都与1相同。注意:解码器使用基于2的幂的最终值,任何其他值将向下舍入到最接近的2的幂。
boolean inScaled
设置此标志时,如果 inDensity和 inTargetDensity不为0,则加载位图时将缩放到匹配 inTargetDensity ,而不是每次绘图到Canvas时都依靠图形系统进行缩放。
BitmapRegionDecoder将忽略此标志,并且不会根据密度缩放输出。 (尽管支持inSampleSize )
这个标志默认打开,如果你需要一个非缩放版本的位图,应该关闭。 九个补丁位图忽略这个标志并且总是缩放。
如果 inPremultiplied设置为false,并且图像具有alpha,则将该标志设置为true可能会导致不正确的颜色。
int inScreenDensity
正在使用的实际屏幕的像素密度。 这纯粹是针对以密度兼容性代码运行的应用程序,其中inTargetDensity实际上是应用程序所看到的密度,而不是真实的屏幕密度。
通过设置它,您可以允许加载代码避免缩放当前处于屏幕密度上升/下降到兼容性密度的位图。 相反,如果inDensity与inScreenDensity相同,则位图将保持原样。 任何使用结果位图的东西也必须使用Bitmap.getScaledWidth和Bitmap.getScaledHeight来解释位图密度和目标密度之间的差异。
这从来不会由BitmapFactory本身为呼叫者自动设置。 它必须明确设置,因为调用者必须以密度感知的方式处理得到的位图。
int inTargetDensity
该位图的目标的像素密度将被绘制到。 这与inDensity和inScaled结合使用,以确定在返回之前是否以及如何缩放位图。
如果这是0, decodeResource(Resources, int) decodeResource(Resources, int, android.graphics.BitmapFactory.Options)和decodeResourceStream(Resources, TypedValue, InputStream, Rect, BitmapFactory.Options)将填充与资源对象的DisplayMetrics关联的密度。 其他功能将保持原样并且不会执行密度缩放。
boolean mCancel
此字段在API级别24中已被弃用。
截至N ,请参阅有关requestCancelDecode()评论。 标记以指示已在该对象上调用取消。 如果有一个中介希望先解码边界然后对图像进行解码,那么这非常有用。 在这种情况下,中介可以在边界解码和图像解码之间检查操作是否被取消。
int outHeight
由此产生的位图高度。 如果inJustDecodeBounds设置为false,则在应用任何缩放后,这将是输出位图的高度。 如果为true,那么将是输入图像的高度,而不考虑缩放比例。
如果尝试解码时出错,outHeight将被设置为-1。
String outMimeType
如果已知,则将该字符串设置为解码图像的mimetype。 如果不知道,或者有错误,则将其设置为空。
int outWidth
由此产生的位图宽度。 如果inJustDecodeBounds设置为false,那么在应用任何缩放后,这将是输出位图的宽度。 如果为真,那将是输入图像的宽度,而不考虑缩放比例。
如果尝试解码时出错,outWidth将被设置为-1。
BitmapFactory.Options ()
创建一个默认的Options对象,如果保持不变,将会给解码器提供相同的结果,就像null传递一样。
void requestCancelDecode ()
此方法在API级别24中已弃用。
从N ,这不会影响解码,尽管它仍然会设置mCancel。 在M及以下版本中,如果可以在此选项对象位于decode ...调用中时从另一个线程调用此选项。 调用它将通知解码器它应该取消它的操作。 这不能保证取消解码,但如果解码完成,则解码器...操作将返回null,或者如果inJustDecodeBounds为true,则将将width / outHeight设置为-1