如何避免Android中的扭曲图像?

时间:2017-06-22 09:38:18

标签: android bitmap base64 image-resizing

当我作为base64发送到服务器时,我想重用位图的大小。例如,原始图像大小为1.2 MB,因此我必须将其大小调整为50KB(服务器限制端)。 The way有时会使图像失真。我看过[1]和[2],但没有帮助。

问题是调整大小后某些图像会变形。

这是我的代码:

private String RescaleImage(String bitmap, int size) {
    try {
        if ((float) bitmap.getBytes().length / 1000 <= Constants.PROFILE_IMAGE_LIMITED_SIZE) {
            return bitmap;
        } else {
            //Rescale
            Log.d("msg", "rescale size : " + size);
            size -= 1;
            bitmap = BitmapBase64Util.encodeToBase64(Bitmap.createScaledBitmap(decodeBase64(bitmap), size, size, false));
            return RescaleImage(bitmap, size);
        }
    } catch (Exception e) {
        return bitmap;
    }
}

encodingToBase64:

public static String encodeToBase64(Bitmap image) {
    Log.d(TAG, "encoding image");

    String result = "";
    if (image != null) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] b = baos.toByteArray();
        result = Base64.encodeToString(b, Base64.DEFAULT);

        Log.d(TAG, result);
        return result;
    }
    return result;
}

在调整大小之前裁剪图像。裁剪后的尺寸为300 x 300

我的问题是:

如何将图片尺寸重复使用到50KB,保持相同比例并避免扭曲?

2 个答案:

答案 0 :(得分:0)

您在Bitmap.createScaledBitmap(decodeBase64(bitmap), size, size, false)中传递相同的宽度和高度。除非您的位图是正方形,否则您必须指定正确的宽度和高度,否则您的图像会根据原始宽高比而变形。我觉得这样的事情会奏效:

Bitmap scaledBitmap = Bitmap.createScaledBitmap(decodeBase64(bitmap);
bitmap = BitmapBase64Util.encodeToBase64(scaledBitmap, scaledBitmap.getWidth(), size.getHeight(), false);

如果您需要压缩以缩小尺寸,请使用此[编辑:您已完成此操作]:

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
byte[] byteArray = stream.toByteArray();

答案 1 :(得分:0)

我更新了我的代码,现在效果更好。

- 修复 -

我不是连续调整位图字符串的大小,而是使用调整大小之前使用的orignal位图。

private String RescaleImage(String bitmap, Bitmap origin_bitmap, int size) {
    try {
        if ((float) bitmap.getBytes().length / 1000 <= Constants.PROFILE_IMAGE_LIMITED_SIZE) {
            return bitmap;
        } else {
            //Rescale
            Log.d("msg", "rescale size : " + size);
            size -= 1;
            bitmap = BitmapBase64Util.encodeToBase64(Bitmap.createScaledBitmap(origin_bitmap, size, size, false));
            return RescaleImage(bitmap, origin_bitmap, size);
        }
    } catch (Exception e) {
        return bitmap;
    }
}

此外,在解码时使用此代码以重用失真。 Bad image quality after resizing/scaling bitmap

如果有更好的解决办法,我总是欢迎为了改进。