话痨喵 2024-09-30 11:48
浏览 2

View与Canvas保存Bitmap问题

#遇到的问题:
我在view绘制的很多的bitmap,我以范围最大的bitmap做我需要保存的Bitmap范围。在保存完成后除我用来做范围的bitmap其余的bitmap全部被位移了。但是在屏幕中显示确实正确的。
保存前:

img


保存后:

img

#问题相关代码:
1.保存图片的代码:

 /**
     * 保存图片Bitmap
     *
     * @param bitmap 底图
     */
    public void saveImageBasemapBitmap(@NonNull Bitmap bitmap,
                                       @NonNull ImageEditCanvasSaveCallback imageEditCanvasSaveCallback) {
        //保存开始回调
        imageEditCanvasSaveCallback.startSave();
        //计算保存图片范围
        //获取底图图片中心点
        int centerBitmapWidth = bitmap.getWidth() / 2;
        int centerBitmapHeight = bitmap.getHeight() / 2;

        //获取left位置
        int left = (int) (this.canvasCorePoint.x - centerBitmapWidth);
        //获取top位置
        int top = (int) (this.canvasCorePoint.y - centerBitmapHeight);
        //获取right位置
        int right = (int) (this.canvasCorePoint.x + centerBitmapWidth);
        //获取bottom位置
        int bottom = (int) (this.canvasCorePoint.y + centerBitmapHeight);

        //创建保存范围
        Rect rect = new Rect(left, top, right, bottom);

        // 创建一个与捕获区域大小相同的 Bitmap
        Bitmap newBitmap = Bitmap.createBitmap(rect.width(), rect.height(), Bitmap.Config.ARGB_8888);
        Canvas newCanvas = new Canvas(newBitmap);
        // 调用 draw 方法绘制内容
        this.customImageEditCanvas.draw(newCanvas);
        //保存结束回调
        imageEditCanvasSaveCallback.endSave(
                ImageUtil.save(newBitmap,
                        this.imageEditCanvasSetModel.getImageEditSavePath(),
                        Bitmap.CompressFormat.PNG)
        );
    }

2.添加bitmap的代码:

    /**
     * 添加标签信息
     *
     * @param ids   标签图标id
     * @param angle 角度
     * @param zoom  缩放比
     */
    public void addLabel(int ids,
                         int angle,
                         float zoom) {

        ImageEditLabelInfo imageEditLabelInfo = new ImageEditLabelInfo();
        imageEditLabelInfo.setLabelBitmap(ImageUtil.generateBitmap(ids));
        imageEditLabelInfo.setAngle(angle);
        imageEditLabelInfo.setZoom(zoom);
        imageEditLabelInfo.setPointF(new PointF((float) getWidth() / 2, (float) getHeight() / 2));
        this.imageEditCanvasInfoModel.getImageEditLabelInfoList().add(imageEditLabelInfo);
        invalidate();
    }

3.绘制最大范围Bitmap的代码:

 /**
     * 绘制图片底图
     *
     * @param canvas 画布
     * @param bitmap 底图
     */
    public void drawImageBasemap(@NonNull Canvas canvas,
                                 @NonNull Bitmap bitmap) {

        //计算图片绘制中心点
        int centerCanvasWidth = canvas.getWidth() / 2;
        int centerCanvasHeight = canvas.getHeight() / 2;
        this.canvasCorePoint = new PointF(centerCanvasWidth, centerCanvasHeight);
        int centerBitmapWidth = bitmap.getWidth() / 2;
        int centerBitmapHeight = bitmap.getHeight() / 2;

        //绘制图片底图
        canvas.drawBitmap(bitmap,
                centerCanvasWidth - centerBitmapWidth,
                centerCanvasHeight - centerBitmapHeight,
                this.imageEditDrawUtil.getImagePaint());
    }

4.绘制其他Bitamap的代码:

 /**
     * 绘制标签图片
     *
     * @param canvas            画布
     * @param selectedLabelsInx 被选中的标签
     */
    public void drawLabelBitmap(@NonNull Canvas canvas,
                                int selectedLabelsInx) {

        List<ImageEditLabelInfo> imageEditLabelInfoList = this.imageEditCanvasInfoModel.getImageEditLabelInfoList();
        if (DataUtil.isNotNullOrEmpty(imageEditLabelInfoList)) {
            for (int i = 0; i < imageEditLabelInfoList.size(); i++) {
                //获取标签信息
                ImageEditLabelInfo imageEditLabelInfo = imageEditLabelInfoList.get(i);
                PointF pointF = imageEditLabelInfo.getPointF();
                //处理标签图片
                Bitmap labelBitmap = this.imageEditDrawUtil.disposeLabelBitmap(imageEditLabelInfo);
                //计算图片绘制点
                int centerBitmapWidth = labelBitmap.getWidth() / 2;
                int centerBitmapHeight = labelBitmap.getHeight() / 2;
                float drawX = pointF.x - centerBitmapWidth;
                float drawY = pointF.y - centerBitmapHeight;
                //绘制标签
                canvas.drawBitmap(labelBitmap,
                        drawX,
                        drawY,
                        this.imageEditDrawUtil.getImagePaint());
                //获取绘制完成后图片的范围(保存顺序:左上,右上,右下,左下)
                List<PointF> rangePointFs = new ArrayList<>();
                rangePointFs.add(new PointF(drawX, drawY));
                rangePointFs.add(new PointF(drawX + labelBitmap.getWidth(), drawY));
                rangePointFs.add(new PointF(drawX + labelBitmap.getWidth(), drawY + labelBitmap.getHeight()));
                rangePointFs.add(new PointF(drawX, drawY + labelBitmap.getHeight()));
                //绘制被选中的信息
                if (selectedLabelsInx >= 0 && i == selectedLabelsInx) {
                    //绘制被选中的标签方框
                    this.imageEditDrawUtil.drawBitmapPane(canvas, rangePointFs);
                    //绘制被选中的标签工具
                    this.imageEditDrawUtil.drawBitmapTool(canvas, rangePointFs, imageEditLabelInfo);
                }
                //计算并保存添加平移容差后的图片范围
                imageEditLabelInfo.setCanvasPointFs(rangePointFs);
            }
        }
    }

#我的初步尝试:
1.所有Bitmap在绘制到Canvas上时取的位置有问题,经过断点后都是一样的。
2.bitmap保存方法有问题,在view绘制在Canvas中的过程中未发现坐标设置项。

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 创建了问题 今天

    悬赏问题

    • ¥20 微信的店铺小程序如何修改背景图
    • ¥15 UE5.1局部变量对蓝图不可见
    • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
    • ¥20 sentry如何捕获上传Android ndk 崩溃
    • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
    • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?
    • ¥15 nasm x86 变量归零
    • ¥65 Tree 树形控件实现单选功能,可以使用element也可以手写一个,实现全选为全选状态
    • ¥60 寻抓云闪付tn组成网页付款链接
    • ¥16 寻字节跳动内部人员帮推简历