3

我们正在开发一个 Android 应用程序,该应用程序可以捕获图像并将其转换为位图以发布到 Rest 服务。

在创建位图时,我们将 BitmapFactory.Options.isSample Size 配置为 4,这在除 HTC One 之外的所有设备上都可以正常工作。HTC One 中的图像失真。

当我们将值更改为 1 时,它在 HTC 上显示了一个很好的图像,但由于内存问题,应用程序在所有其他设备上崩溃了。

该问题与可用的堆大小有关。

  1. HTC one 在 HTC one 上显示失真图像的原因是什么?
  2. 为什么应用程序在 S3 上崩溃,它也具有相同的 16 构建版本,但由于堆大小不可用而崩溃。
  3. 为什么所有像 droid 这样的低版本手机都适用于 4 的样本大小。
  4. 检查应用程序可用内存空间并使用可用于使用 BITMAP 的最佳方法是什么。

当我们在清单文件中配置 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;
    }
4

1 回答 1

4

看:http:
//developer.android.com/reference/android/graphics/BitmapFactory.Options.html

1:因为... Direct FROM DOC:如果设置为 > 1 的值,则请求解码器对原始图像进行二次采样,返回较小的图像以节省内存。样本大小是对应于解码位图中的单个像素的任一维度中的像素数。例如, inSampleSize == 4 返回的图像是原始宽度/高度的 1/4,像素数的 1/16。任何 <= 1 的值都被视为 1。注意:解码器使用基于 2 的幂的最终值,任何其他值将向下舍入到最接近的 2 幂。

2:我的猜测是因为并非所有设备都具有相同的可用内存。3:你需要计算样本量 不只是设置一个数字...

2,3:所有设备都有不同的相机分辨率。

要解决这个问题,请阅读:http: //developer.android.com/training/displaying-bitmaps/index.html

    public static Bitmap lessResolution(String filePath) {
    int reqHeight = 120;
    int reqWidth = 120;
    BitmapFactory.Options options = new BitmapFactory.Options();

    // First decode with inJustDecodeBounds=true to check dimensions
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(filePath, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth,
            reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;

    return BitmapFactory.decodeFile(filePath, options);
}

private static int calculateInSampleSize(BitmapFactory.Options options,
        int reqWidth, int reqHeight) {

    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        // Calculate ratios of height and width to requested height and
        // width
        final int heightRatio = Math.round((float) height
                / (float) reqHeight);
        final int widthRatio = Math.round((float) width / (float) reqWidth);

        // Choose the smallest ratio as inSampleSize value, this will
        // guarantee
        // a final image with both dimensions larger than or equal to the
        // requested height and width.
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    }
    return inSampleSize;
}
于 2013-08-14T22:51:02.470 回答