Android如何截取保存超过屏幕宽度的图片

保存图片原始代码

但这种事无法保存超出屏幕宽度的图片的

    public static File saveBitmap(View view, String filePath, String fileName) {
        if (view == null) {
            return null;
        } else {
            view.setDrawingCacheEnabled(true);
            view.buildDrawingCache();
            return saveBitmap(view.getDrawingCache(), filePath, fileName, false);
        }
    }

    public static File saveBitmap(Bitmap bitmap, String filePath, String fileName, Boolean recycle) {
        File outputFile = new File(filePath, fileName);
        if (outputFile.exists()) {
            Log.e("BitmapUtils", "文件" + outputFile.getPath() + "已存在");
            return outputFile;
        } else if (bitmap != null && !bitmap.isRecycled()) {
            FileOutputStream fos = null;

            try {
                Log.i("BitmapUtils", "开始转换图片");
                if (filePath.endsWith("/")) {
                    FileUtils.mkdir(filePath.substring(0, filePath.length() - 1));
                } else {
                    FileUtils.mkdir(filePath);
                }
                outputFile.createNewFile();
                fos = new FileOutputStream(outputFile);
                boolean compressOk = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
                if (!compressOk) {
                    outputFile = null;
                }
            } catch (Exception var9) {
                var9.printStackTrace();
            } finally {
                if (recycle) {
                    bitmap.recycle();
                }
                FZUtils.flush(fos);
                FZUtils.close(fos);
            }

            return outputFile;
        } else {
            return null;
        }
    }

保存超出屏幕宽度的图片

需要注意的是,需要声明 android:clipChildren="false"
灵感来源 https://blog.csdn.net/hailong0529/article/details/88677358

    public static Bitmap getLinearLayoutBitmap(LinearLayout linearLayout) {
        int h = 0;
        Bitmap bitmap;
        for (int i = 0; i < linearLayout.getChildCount(); i++) {
            h += linearLayout.getChildAt(i).getHeight();
        }
        // 创建对应大小的bitmap
        bitmap = Bitmap.createBitmap(linearLayout.getWidth(), h,
                Bitmap.Config.ARGB_8888);
        final Canvas canvas = new Canvas(bitmap);
        linearLayout.draw(canvas);
        return bitmap;
    }

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipChildren="false">

    <LinearLayout
        android:id="@+id/layoutContent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        android:orientation="horizontal"
        android:clipChildren="false"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

当然,还需要使用 setLayoutParams 的方式,确定 layoutContent 的宽高,否则可能截出来的图不是你想要的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容