我们正在开发一款Android应用程序,该应用程序捕获图像并将其转换为位图以发布到Rest服务。在创建位图时,我们已将 BitmapFactory.Options.isSampleSize 配置为值为4,除了HTC One之外的所有设备上都可以正常工作。但在HTC One上,图像失真了。当我们将值更改为1时,在HTC One上显示出良好的图像,但由于内存问题,所有其他设备上的应用程序都会崩溃。这个问题与可用的堆大小有关。
以下是需要回答的问题:
1. HTC One为什么会显示失真的图像? 2. 为什么S3也有相同版本16的构建,但由于堆大小不足而崩溃? 3. 所有较低版本的手机(如Droid)为什么对于采样率为4的情况都可以正常工作? 4. 检查应用程序可用内存空间并使用可用内存来处理位图的最佳方法是什么?
当我们在清单文件中配置 android:largeHeap 时,似乎可以解决此问题,但这似乎不是一个可靠的解决方案。
我能够找到使用相机参数拍摄的图片大小,然后得出位图的最佳采样率。下面的代码解决了问题。但这是正确的做法吗?还是应该计算采样率,而不是使用1和4?
以下是需要回答的问题:
1. HTC One为什么会显示失真的图像? 2. 为什么S3也有相同版本16的构建,但由于堆大小不足而崩溃? 3. 所有较低版本的手机(如Droid)为什么对于采样率为4的情况都可以正常工作? 4. 检查应用程序可用内存空间并使用可用内存来处理位图的最佳方法是什么?
当我们在清单文件中配置 android:largeHeap 时,似乎可以解决此问题,但这似乎不是一个可靠的解决方案。
我能够找到使用相机参数拍摄的图片大小,然后得出位图的最佳采样率。下面的代码解决了问题。但这是正确的做法吗?还是应该计算采样率,而不是使用1和4?
private Bitmap createImaegBitmap(byte[] data)
{
BitmapFactory.Options opt;
opt = new BitmapFactory.Options();
opt.inTempStorage = new byte[16 * 1024];
Parameters parameters = ((ReceiptCollection)getApplication()).getParams();
Size size = parameters.getPictureSize();
int height11 = size.height;
int width11 = size.width;
float mb = (width11 * height11) / 1024000;
if (mb > 4f)
opt.inSampleSize = 4;
else if (mb > 3f)
opt.inSampleSize = 1;
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,opt);
return bitmap;
}