java - 位图无法加载 2MB 图像

标签 java android

这是我正在使用的代码:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 8;
Bitmap imatgeOriginal = BitmapFactory.decodeFile(imageUrl, options);
Bitmap resizedbitmap = Bitmap.createScaledBitmap(imatgeOriginal, 1000, 1000, true);

正如你所看到的,我使用选项调整了图像的大小,但无论如何它只是在最后一行崩溃,抛出 NullPointerException。所以 imatgeOriginalnull

为什么会发生这种情况?

一些注意事项:

  • 图片大小为 2 MB(小于 16 MB 限制),大小为 1105 × 1491
  • 该图片确实存在
  • 相同的代码适用于小于 1.5 MB 的图像

logcat 中的输出:

08-22 15:11:13.249: E/AndroidRuntime(5404): FATAL EXCEPTION: main
08-22 15:11:13.249: E/AndroidRuntime(5404):
java.lang.NullPointerException 08-22 15:11:13.249:
E/AndroidRuntime(5404):     at
android.graphics.Bitmap.createScaledBitmap(Bitmap.java:432) 08-22
15:11:13.249: E/AndroidRuntime(5404):   at
myclass.onAnimationEnd(productView.java:2126) 08-22 15:11:13.249:
E/AndroidRuntime(5404):     at
android.view.animation.AnimationSet.getTransformation(AnimationSet.java:397)

编辑:

发生了一些奇怪的事情,文件图像存在,路线是正确的。然而,android 检测到该图像已损坏,或者至少无法使用任何可用工具(默认图库、文件资源管理器、没有我的应用程序)打开它。 但是,如果我将图像下载到计算机上,图像就会完美显示。该应用程序也在 iOS 中运行,并且实际上在那里可以看到相同的图像,并且看起来没有损坏。

所以我猜想 Android 加载 JPEG 文件存在一些限制。

你们有遇到过类似的问题吗?

我发现的一些资源: http://code.google.com/p/skia/issues/detail?id=69#c2 Unable to load JPEG-image with BitmapFactory.decodeFile. Returns null

最佳答案

您可以压缩位图大小Bitmap.compress()

尝试这种方法,它会减小大小,这可能会帮助您加载它,因为 2MB 对于某些手机来说已经很大了

int MAX_IMAGE_SIZE = 200 * 1024; // max final file size
Bitmap bmpPic = BitmapFactory.decodeFile(fileUri.getPath());
if ((bmpPic.getWidth() >= 1024) && (bmpPic.getHeight() >= 1024)) {
    BitmapFactory.Options bmpOptions = new BitmapFactory.Options();
    bmpOptions.inSampleSize = 1;
    while ((bmpPic.getWidth() >= 1024) && (bmpPic.getHeight() >= 1024)) {
        bmpOptions.inSampleSize++;
        bmpPic = BitmapFactory.decodeFile(fileUri.getPath(), bmpOptions);
    }
    Log.d(TAG, "Resize: " + bmpOptions.inSampleSize);
}
int compressQuality = 104; // quality decreasing by 5 every loop. (start from 99)
int streamLength = MAX_IMAGE_SIZE;
while (streamLength >= MAX_IMAGE_SIZE) {
    ByteArrayOutputStream bmpStream = new ByteArrayOutputStream();
    compressQuality -= 5;
    Log.d(TAG, "Quality: " + compressQuality);
    bmpPic.compress(Bitmap.CompressFormat.JPEG, compressQuality, bmpStream);
    byte[] bmpPicByteArray = bmpStream.toByteArray();
    streamLength = bmpPicByteArray.length;
    Log.d(TAG, "Size: " + streamLength);
}
try {
    FileOutputStream bmpFile = new FileOutputStream(finalPath);
    bmpPic.compress(Bitmap.CompressFormat.JPEG, compressQuality, bmpFile);
    bmpFile.flush();
    bmpFile.close();
} catch (Exception e) {
    Log.e(TAG, "Error on saving file");
}

关于java - 位图无法加载 2MB 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18381464/

相关文章:

Java 日志请求和相应的响应

java - 直接从 Windows 剪贴板获取二进制数据

java - Android 下载管理器 - 无法知道下载的大小

java - System.setProperty 的范围

java - 按单选按钮两次,计算两次

android - 如何从 CLI 构建和运行 android 应用程序?

java - 如何在hadoop的reduce中将genericWritable恢复为我的用户定义的Writable?

java - 为什么Java中没有局部静态变量?

android - 将 CastCompanionLibrary 添加到项目 - Android Studio

java - 如何调用 onMeasure 方法? - 安卓