Android image resolution and quality optimization

For readers of image performance optimization, they must also understand the principle of image optimization, so directly upload the code and record it for future use.

/**
     * 加载资源图片
     * @param context 上下文
     * @param inDraRes 图片资源id
     * @param iv 装载图片View
     * @param radius 圆角大小
     */
    public static void loadAndCompressImg(Context context, @DrawableRes int inDraRes, ImageView iv, int radius) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        options.inSampleSize = 1;
        BitmapFactory.decodeResource(context.getResources(), inDraRes, options);

        int inSampleSize = 1;
        int srcWidth = options.outWidth;
        int srcHeight = options.outHeight;
        srcWidth = srcWidth % 2 == 1 ? srcWidth + 1 : srcWidth;
        srcHeight = srcHeight % 2 == 1 ? srcHeight + 1 : srcHeight;

        int longSide = Math.max(srcWidth, srcHeight);
        int shortSide = Math.min(srcWidth, srcHeight);

        /**
         * 如分辨率1920*1080中,宽高中最长/短=0.5625
         * 以下算法是计算inSampleSize值,对Bitmap图片质量和分辨率进行调整优化
         */
        float scale = ((float) shortSide / longSide);
        if (scale <= 1 && scale > 0.5625) {
            if (longSide < 4990) {
                inSampleSize = 2;
            } else if (longSide > 4990 && longSide < 10240) {
                inSampleSize = 4;
            } else {
                inSampleSize = longSide / 1280;
            }
        } else if (scale <= 0.5625 && scale > 0.5) {
            inSampleSize = longSide / 1280 == 0 ? 1 : longSide / 1280;
        } else {
            inSampleSize = (int) Math.ceil(longSide / (1280.0 / scale));
        }

        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        options.inSampleSize = inSampleSize;
        options.inJustDecodeBounds = false;
        Bitmap tagBitmap = BitmapFactory.decodeResource(context.getResources(), inDraRes, options);
        tagBitmap.compress(Bitmap.CompressFormat.JPEG, 60, stream);
        tagBitmap.recycle();

        byte[] imgBytes = stream.toByteArray();
        try {
            stream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        RequestOptions requestOptions = new RequestOptions()
                .placeholder(R.drawable.ic_load_error)
                .error(R.drawable.ic_load_error)
                .transform(new GlideRoundTransform(context, radius))
                .dontAnimate();
        Glide.with(context).load(imgBytes).apply(requestOptions).into(iv);
    }

Guess you like

Origin blog.csdn.net/weixin_44715716/article/details/131573132