react-native-wechat icon indicating copy to clipboard operation
react-native-wechat copied to clipboard

建议增加图片自动缩小处理

Open someok opened this issue 6 years ago • 2 comments

这两天使用本组件时候发现部分尺寸较大图片分享微信的时候会失败,检测后发现本组件用的是 Fresco,查了下文档发现这个其实不支持 png 的缩放,而且让用户来预处理图片控制大小也没有意义(反正只要能分享到微信就 ok)

我自己 fork 了一份把图片处理改为如下模式:

private void _getImage(Uri uri, final ImageCallback imageCallback) {
        // 微信最大支持 10 Mb
        int maxBytes = 1024 * 1024 * 10;
        String fileUri = uri.toString();
        if (fileUri.startsWith("file://")) {
            fileUri = fileUri.replace("file://", "");
            Log.d("file", fileUri);
        }
        Bitmap bitmap = BitmapFactory.decodeFile(fileUri);

        while (bitmap.getByteCount() > maxBytes) {
            Matrix matrix = new Matrix();
            matrix.postScale(0.8f, 0.8f);
            Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap
                    .getHeight(), matrix, true);

            bitmap.recycle();
            bitmap = resizeBitmap;
        }

        imageCallback.invoke(bitmap);
    }

暂时用的比较傻的方法:循环缩小,每次缩小到 0.8,然后比较大小,合适了就下一步,不合适就继续缩。

这个功能我建议直接集成到组件里面,减少用户的麻烦。

someok avatar Sep 18 '19 13:09 someok

PR Please ❤️

0xinhua avatar Sep 21 '19 12:09 0xinhua

这两天使用本组件时候发现部分尺寸较大图片分享微信的时候会失败,检测后发现本组件用的是 Fresco,查了下文档发现这个其实不支持 png 的缩放,而且让用户来预处理图片控制大小也没有意义(反正只要能分享到微信就 ok)

我自己 fork 了一份把图片处理改为如下模式:

private void _getImage(Uri uri, final ImageCallback imageCallback) {
        // 微信最大支持 10 Mb
        int maxBytes = 1024 * 1024 * 10;
        String fileUri = uri.toString();
        if (fileUri.startsWith("file://")) {
            fileUri = fileUri.replace("file://", "");
            Log.d("file", fileUri);
        }
        Bitmap bitmap = BitmapFactory.decodeFile(fileUri);

        while (bitmap.getByteCount() > maxBytes) {
            Matrix matrix = new Matrix();
            matrix.postScale(0.8f, 0.8f);
            Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap
                    .getHeight(), matrix, true);

            bitmap.recycle();
            bitmap = resizeBitmap;
        }

        imageCallback.invoke(bitmap);
    }

暂时用的比较傻的方法:循环缩小,每次缩小到 0.8,然后比较大小,合适了就下一步,不合适就继续缩。

这个功能我建议直接集成到组件里面,减少用户的麻烦。

这个有完整的代码吗,我使用你的方法时, Bitmap bitmap = BitmapFactory.decodeFile(fileUri);这个bitmap一直返回为空,请问一下这是什么原因?

liujingshen avatar Sep 08 '20 08:09 liujingshen