首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >zetbaitsu/Compressor分辨率不起作用

zetbaitsu/Compressor分辨率不起作用
EN

Stack Overflow用户
提问于 2020-03-03 17:08:13
回答 1查看 632关注 0票数 0

因此,我使用zetbaitsu/Compressor库进行图像压缩并调整图像大小,但是当我尝试压缩原始尺寸(3503 X 5254)的图像尺寸时,以下高度值的结果如下所示

800,700,600将提供(876 X 1314)的分辨率,是原始大小的1/8

当值为900+时,图像的分辨率为(1752 x2627),是原始图像的1/2。

所以,有没有办法完全按照我们的标准改变大小,因为我尝试了其他类似的问题,我没有得到想要的结果。

EN

回答 1

Stack Overflow用户

发布于 2020-03-03 18:05:49

实际上,只有通过为这个库创建自己的自定义约束才能实现。这个库(Methodcall)(Method declaration)通常的分辨率约束使用以下方法(found here):

代码语言:javascript
复制
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()调用更改为您自己的方法,以计算精确大小的修饰符。

编辑:这是一个示例约束,它应该如何工作。到目前为止我还不能测试,但这应该会让你了解它是如何工作的:

代码语言:javascript
复制
    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;
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60503664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档