#遇到的问题:
我在view绘制的很多的bitmap,我以范围最大的bitmap做我需要保存的Bitmap范围。在保存完成后除我用来做范围的bitmap其余的bitmap全部被位移了。但是在屏幕中显示确实正确的。
保存前:
保存后:
#问题相关代码:
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中的过程中未发现坐标设置项。