所以我使用zetbaitsu/Compressor库进行图像压缩并调整图像大小,但当我尝试压缩原始尺寸(3503 x 5254(的图像尺寸时,以下高度值的结果如下
800700600的分辨率为(876 x 1314(,是原始尺寸和的1/8
当值为900+时,图像的分辨率为(1752 x2627(,为原始分辨率的1/2。
那么,有没有办法完全按照我们的标准改变尺寸,因为我尝试了其他类似的问题,但我没能得到想要的结果。
实际上只有为这个库创建自己的自定义约束才能实现。此lib(Methodcall((方法声明(的常见解析约束使用以下方法(在此处找到(:
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;
}
因此,只要图像的大小大于请求的大小,它就会将图像的大小减小2。
改变这一点的最简单方法可能是创建自己的自定义约束,并将calculateInSampleSize()
调用更改为自己的方法,以计算修改器的确切大小。
编辑:这是一个示例约束,它应该如何工作。到目前为止我还不能测试,但这应该会让你知道它是如何工作的:
public class SizeContstraint implements Constraint
{
private int _height;
// Resulting image height
public SizeContstraint(int height)
{
_height = height;
}
// Checks, if the constraint is valid
@Override
public boolean isSatisfied(@NotNull final File file)
{
// Get the file options (height, width, e.t.c)
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file.getAbsolutePath(), options);
// Calculate if the current image is bigger than the necessary size
return calculateExactSizeModifier(options, _height) > 1;
}
// This method is only called, if the constraint is invald (the image is too big)
@NotNull
@Override
public File satisfy(@NotNull final File file)
{
int height = _height;
int width = 0;
// Get the file options (height, width, e.t.c)
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file.getAbsolutePath(), options);
// Get the size modifier to be able to resize the image
int modifier = calculateExactSizeModifier(options, height);
// Calculate the width using the modifier
width = options.outWidth / modifier;
// Resize the file into a bitmap
Bitmap bmp = id.zelory.compressor.UtilKt.decodeSampledBitmapFromFile(file, width, height);
// Write the bitmap back into the file
return id.zelory.compressor.UtilKt.overWrite(file, bmp, Bitmap.CompressFormat.JPEG, 100);
}
private int calculateExactSizeModifier(BitmapFactory.Options options, int reqHeight)
{
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int modifier = 1;
// Calculate modifier if height bigger than requested height
if (height > reqHeight)
{
modifier = height / reqHeight;
}
return modifier;
}
}