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