gpt4 book ai didi

java - Android - 缩放和压缩位图

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:17:20 26 4
gpt4 key购买 nike

我正在开发一个 Android 应用程序,它具有相机捕获和照片上传功能。如果设备有高分辨率摄像头,捕获的图像尺寸会非常大(1~3MB 或更大)。
由于应用程序需要将此图片上传到服务器,因此我需要在上传前压缩图片。例如,如果相机拍摄了一张 1920x1080 的全分辨率照片,理想的输出是保持 16:9 的图像比例,将其压缩为 640x360 图像以降低一些图像质量并使其以字节为单位变小。

这是我的代码(从谷歌引用):

/**
* this class provide methods that can help compress the image size.
*
*/
public class ImageCompressHelper {

/**
* Calcuate how much to compress the image
* @param options
* @param reqWidth
* @param reqHeight
* @return
*/
public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;

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

final int halfHeight = height / 2;
final int halfWidth = width / 2;

// Calculate the largest inSampleSize value that is a power of 2 and keeps both
// height and width larger than the requested height and width.
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}

return inSampleSize;
}

/**
* resize image to 480x800
* @param filePath
* @return
*/
public static Bitmap getSmallBitmap(String filePath) {

File file = new File(filePath);
long originalSize = file.length();

MyLogger.Verbose("Original image size is: " + originalSize + " bytes.");

final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);

// Calculate inSampleSize based on a preset ratio
options.inSampleSize = calculateInSampleSize(options, 480, 800);

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

Bitmap compressedImage = BitmapFactory.decodeFile(filePath, options);

MyLogger.Verbose("Compressed image size is " + sizeOf(compressedImage) + " bytes");

return compressedImage;
}

上面代码的问题是:

  1. 无法保持比例,代码强制将图像调整为 480x800。如果用户以其他比例拍摄图像,则压缩后的图像效果不佳。
  2. 它运行不正常。无论原始文件大小是多少,代码总是会将图像大小更改为 7990272byte。如果原始图像尺寸已经很小,它会变大(我的测试结果是拍了一张我的墙的照片,几乎是单色的):

    原始图像大小为:990092 字节。
    压缩后的图片大小为 7990272 字节

请问有没有更好的压缩图片的方法可以顺利上传?

最佳答案

  1. 您需要确定宽度或高度的限制(显然不是两者)。然后用计算出的尺寸替换那些固定的图像尺寸,比如:

    int targetWidth = 640; // your arbitrary fixed limit
    int targetHeight = (int) (originalHeight * targetWidth / (double) originalWidth); // casts to avoid truncating

    (根据需要添加横向/纵向方向的检查和计算备选方案。)

  2. @harism 也评论说:您提到的大尺寸是 480x800 位图的原始 尺寸,而不是文件尺寸,在您的情况下应该是 JPEG。顺便说一句,您打算如何保存该位图?您的代码似乎不包含保存部分。

    参见 this question here寻求帮助,关键是这样的:

    OutputStream imagefile = new FileOutputStream("/your/file/name.jpg");
    // Write 'bitmap' to file using JPEG and 80% quality hint for JPEG:
    bitmap.compress(CompressFormat.JPEG, 80, imagefile);

关于java - Android - 缩放和压缩位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20599834/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com