Java 如何使用位图和画布?创建自定义水印的步骤

Java 如何使用位图和画布?创建自定义水印的步骤,java,android,canvas,android-bitmap,Java,Android,Canvas,Android Bitmap,在我的应用程序中,当用户从相机捕获图像或从gallery上传图像时,我试图在图像上创建水印。但问题是,当我在画布上绘制文本时(这是我的图像本身)。我每次都得到不同的结果 我想在中间垂直显示3个文本,在左侧垂直显示3个文本,在右侧垂直显示1个徽标。我想要这样的水印。如果用户从相机捕获图像或浏览多媒体资料。无论图像大小或像素密度如何,文本和徽标(水印)应保持相同大小且清晰可见 有人能告诉我如何做到这一点吗。我尝试了位图和画布,但我得到了不同的文本大小和模糊的文本,以及不同图像上的所有内容 在下面的图

在我的应用程序中,当用户从相机捕获图像或从gallery上传图像时,我试图在图像上创建水印。但问题是,当我在画布上绘制文本时(这是我的图像本身)。我每次都得到不同的结果

我想在中间垂直显示3个文本,在左侧垂直显示3个文本,在右侧垂直显示1个徽标。我想要这样的水印。如果用户从相机捕获图像或浏览多媒体资料。无论图像大小或像素密度如何,文本和徽标(水印)应保持相同大小且清晰可见

有人能告诉我如何做到这一点吗。我尝试了位图和画布,但我得到了不同的文本大小和模糊的文本,以及不同图像上的所有内容

在下面的图片中,这是我的问题

1.从相机中点击的图像,但我从浏览图像中使用它

2.从“捕获图像”按钮中选择的图像

3.来自图库的随机低质量图像

这是密码

 Glide.with(getApplicationContext())
                    .load(uri)
                    .asBitmap()
                    .into(new SimpleTarget<Bitmap>(200, 100) {
                        @Override
                        public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
                           //this is the required bitmap
                            pikedPhoto = resource.copy(Bitmap.Config.ARGB_8888, true);
                            Canvas canvas = new Canvas(pikedPhoto);
                            Paint paintCenter = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG | Paint.FILTER_BITMAP_FLAG);
                            paintCenter.setStyle(Paint.Style.FILL);
                            paintCenter.setColor(getResources().getColor(android.R.color.black)); // Text Color
                            paintCenter.setColor(Color.RED);
                            //float size = convertDpToPx(context, 25);
                            //paintCenter.setTextSize(size); //Text Size
                            paintCenter.setTextAlign(Paint.Align.CENTER);
                            float textY= pikedPhoto.getHeight();
                            float textX= pikedPhoto.getWidth()/2;
                            String text1 = "Centre Text";
                            canvas.drawText(text1,textX,textY,paintCenter);
                            canvas.drawText(text1,textX,textY-10,paintCenter);
                            canvas.drawText(text1,textX,textY-20,paintCenter);


                            String text2 = "Left Text";
                            Paint paintLeft = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG | Paint.FILTER_BITMAP_FLAG);
                            paintLeft.setStyle(Paint.Style.FILL);
                            paintLeft.setColor(getResources().getColor(android.R.color.black)); // Text Color
                            paintLeft.setColor(Color.RED);
                            //float sizeLeft = convertDpToPx(context, 25);
                            //paintLeft.setTextSize(sizeLeft); //Text Size
                            paintLeft.setTextAlign(Paint.Align.LEFT);
                            float textYL= pikedPhoto.getHeight();
                            canvas.drawText(text2,0,textYL,paintLeft);
                            canvas.drawText(text2,0,textYL-10,paintLeft);
                            canvas.drawText(text2,0,textYL-20,paintLeft);
                            // in this case, center.x and center.y represent the coordinates of the center of the rectangle in which the text is being placed

                            //canvas.drawBitmap(logo, (pikedPhoto.getWidth()) / 4, 250, new Paint());
                            img.setImageBitmap(pikedPhoto);
                        }
                    });
Glide.with(getApplicationContext())
.load(uri)
.asBitmap()
.into(新的SimpleTarget(200100){
@凌驾
public void onResourceReady(位图资源、GlideAnimation){
//这是所需的位图
pikedPhoto=resource.copy(Bitmap.Config.ARGB_8888,true);
Canvas Canvas=新画布(pikedPhoto);
Paint paintCenter=新油漆(Paint.ANTI_别名_标志| Paint.抖动_标志| Paint.FILTER_位图_标志);
paintCenter.setStyle(Paint.Style.FILL);
paintCenter.setColor(getResources().getColor(android.R.color.black));//文本颜色
paintCenter.setColor(颜色:红色);
//float size=convertDpToPx(上下文,25);
//paintCenter.setTextSize(大小);//文本大小
paintCenter.setTextAlign(Paint.Align.CENTER);
float textY=pikedPhoto.getHeight();
float textX=pikedPhoto.getWidth()/2;
String text1=“中心文本”;
canvas.drawText(text1、textX、textY、paintCenter);
canvas.drawText(text1、textX、textY-10、paintCenter);
canvas.drawText(text1、textX、textY-20、paintCenter);
String text2=“左文本”;
Paint paintLeft=新油漆(油漆.ANTI_别名_标志|油漆.DITHER_标志|油漆.FILTER_位图_标志);
paintLeft.setStyle(Paint.Style.FILL);
paintLeft.setColor(getResources().getColor(android.R.color.black));//文本颜色
paintLeft.setColor(Color.RED);
//float-sizeLeft=convertDpToPx(上下文,25);
//paintLeft.setTextSize(sizeLeft);//文本大小
paintLeft.setTextAlign(Paint.Align.LEFT);
float textYL=pikedPhoto.getHeight();
canvas.drawText(text2,0,textYL,paintLeft);
canvas.drawText(text2,0,textYL-10,paintLeft);
canvas.drawText(text2,0,textYL-20,paintLeft);
//在本例中,center.x和center.y表示放置文本的矩形中心的坐标
//drawBitmap(logo,(pikedPhoto.getWidth())/4250,new Paint());
img.setImageBitmap(pikedPhoto);
}
});

请添加您的尝试代码我已经添加了代码@RishabhDhawanI尝试了您的代码,它为不同的
位图显示相同的文本大小。唯一的问题是,当您使用硬编码值在
画布
上绘制
文本
时,您的
文本
可能会重叠。但这并不清楚,不同位图的文本大小会有增减。对于任意大小的位图,是否有任何方法可以清晰、精确地显示相同大小的文本。就像一个标准的水印。如果可以,请帮助@rishabhdhawa这是我使用您的代码得到的