- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在我的应用程序中,我以这种方式加载 32 位 (ARGB_8888) 图像:
Bitmap.Config mBitmapConfig;
mBitmapConfig = Bitmap.Config.ARGB_8888;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = mBitmapConfig;
mBitmap = BitmapFactory.decodeFile(SourceFileName, options);
然后缩放:
mBitmap = Bitmap.createScaledBitmap(mBitmap, iW, iH, true);
如果我用于缩放原始位图的相同宽度和高度,则它是大小的 1/2(以兆字节为单位)(我正在观察堆大小)。将值“ARGB_8888”更改为“RGB_565”(24 位)在缩放后给出相同的大小(以兆字节为单位)。
有人可以解释这种现象并给我一个建议,如何在 32 位颜色空间中缩放位图?谢谢!
最佳答案
我在 Bitmap 类 ( Link ) 的源代码中查找了 createScaledBitmap 方法:
public static Bitmap createScaledBitmap(Bitmap src, int dstWidth,
int dstHeight, boolean filter) {
Matrix m;
synchronized (Bitmap.class) {
// small pool of just 1 matrix
m = sScaleMatrix;
sScaleMatrix = null;
}
if (m == null) {
m = new Matrix();
}
final int width = src.getWidth();
final int height = src.getHeight();
final float sx = dstWidth / (float)width;
final float sy = dstHeight / (float)height;
m.setScale(sx, sy);
Bitmap b = Bitmap.createBitmap(src, 0, 0, width, height, m, filter);
synchronized (Bitmap.class) {
// do we need to check for null? why not just assign everytime?
if (sScaleMatrix == null) {
sScaleMatrix = m;
}
}
return b;
}
并且调用 createBitmap() 应该返回未更改的源位图,因为在方法主体中进行了此检查:
if (!source.isMutable() && x == 0 && y == 0 && width == source.getWidth() &&
height == source.getHeight() && (m == null || m.isIdentity())) {
return source;
}
仅看一下,您的原始位图似乎已返回,但是,如果您的位图恰好是可变的,您实际上可以跳过此检查并在此处结束:
if (m == null || m.isIdentity()) {
bitmap = createBitmap(neww, newh,
source.hasAlpha() ? Config.ARGB_8888 : Config.RGB_565);
paint = null; // not needed
}
由于您没有执行任何缩放,您的矩阵将是单位矩阵,并且满足条件。如您所见,创建的位图取决于源位图中的 alpha。如果不存在 alpha,您最终会得到 RGB_565 格式而不是 ARGB_8888 格式的结果位图。
因此,要缩放并保留 32 位格式,您的位图应该是不可变的或使用 Alpha channel 。
关于android - "Bitmap.createScaledBitmap"是否将 32 位图像转换为 24 位图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6278992/
android.graphics.Bitmap.createScaledBitmap的声明是 public static Bitmap createScaledBitmap (Bitmap src
我完全理解“过早的优化是万恶之源。”但是,我已经到了这样的地步:我相信我想做的优化不再被认为是“过早的优化” ”。 我正在编写一个 Android 应用程序,除其他外,它还可以从 USB 设备流式传输
我正在使用以下代码: private Bitmap decodeFile(File f) { try { // decode image size Bitmap
我正在创建运行时 ImageView 并根据图像设置宽度和高度,它在 android marshmallows 下工作完美,但在 marshmallows 中不工作。 我正在检查我的图像不为空并且位图
尽管使用软引用并使用 inSample 大小作为选项,但我还是收到内存不足错误。我在调用 createScaledBitmap 时收到错误。非常感谢任何类型的指示。 最佳答案 如果您使用 Bitmap
所以我使用 Bitmap.createScaledBitmap 来缩放和显示我从我的 android 应用程序本地保存的 ImageView 文件。看起来它工作得很好,但现在似乎由于某种原因只能缩放某
指定缩放位图的宽度和高度时,该方法是要求像素还是密度无关像素? 我有一个 240dp 的设备,当将图像缩放到 240x240 时,图像几乎只有屏幕尺寸的一半。我期待它是全屏的。这是否意味着该方法使用像
我在使用 Bitmap.copy 函数时遇到问题。这段代码工作正常, Bitmap tempBM = Bitmap.createScaledBitmap(sourceBitmap, sourceBit
我想创建一个缩放位图,但我似乎得到了一个不成比例的图像。它看起来像一个正方形,而我想要长方形。 我的代码: Bitmap resizedBitmap = Bitmap.createScaledBitm
这是我第一次遇到一个问题,尽管进行了彻底的搜索,但似乎还没有人问过。 我在使用 Bitmap.createScaledBitmap() 时遇到问题,无论输入的配置如何,生成的缩放位图始终是 ARGB_
在我的应用程序中,我以这种方式加载 32 位 (ARGB_8888) 图像: Bitmap.Config mBitmapConfig; mBitmapConfig = Bitmap.Config.
我的应用的主要目的是按照图像所示的方式显示图像 private void setSelectedImage(int selectedImagePosition) { BitmapDrawabl
我是一名优秀的程序员,十分优秀!