在Android中添加水印到图像

时间:2014-12-25 06:09:02

标签: android image-processing canvas watermark

我想在Android应用中为图像添加水印。 在我的应用程序中,用户可以选择图像并在编辑文本中写入文本,按下按钮后,我想要选择带有水印文本的图像。 我试过下面的代码,但它没有用。

 public static void mark(String watermark,String filePath) {
        try{
                Bitmap bmp = BitmapFactory.decodeFile(filePath);
                int w = bmp.getWidth();
                int h = bmp.getHeight();
                Bitmap result = Bitmap.createBitmap(100, 100, bmp.getConfig());
                Canvas canvas = new Canvas(result);
                canvas.drawBitmap(bmp, 0, 0, null);
                Paint paint = new Paint();
                paint.setColor(Color.WHITE);
                paint.setAlpha(40);
                paint.setTextSize(20);
                paint.setAntiAlias(true);
                canvas.drawText(watermark,w/2, h/2+20, paint);
                File nFile = new File(getDevicePath(mContext)+"output1.jpg");
                nFile.createNewFile();
                FileOutputStream fOut = new FileOutputStream(nFile);
                bmp.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
                fOut.flush();
                fOut.close();   
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }

请给我解决上述问题的方法。

提前致谢。

3 个答案:

答案 0 :(得分:1)

问题1:您不希望“水印图像”与原始图像的大小相同吗?所以,而不是硬编码值:

           Bitmap result = Bitmap.createBitmap(w, h, bmp.getConfig());

问题2:您不想写出result位图吗?所以,相反:

           result.compress(Bitmap.CompressFormat.JPEG, 100, fOut);

问题3:是一个文件,即使图片不是你想要的,甚至写在你想要的地方?您可能需要使用以下内容添加“/”分隔符:

           File nFile = new File(getDevicePath(mContext)+ File.separator + "output1.jpg");

答案 1 :(得分:1)

请将此代码定义到您的方法中,并创建动态文本视图以实现此目的。这对我来说很好,imgPreviewRotate是我的imageview所以请更改imageview并查看它。

TextView txtWatermark = new TextView(MainActivity.this);
txtWatermark.setGravity(Gravity.RIGHT | Gravity.BOTTOM);
txtWatermark.setText(getResources().getString("Dummy text"));
txtWatermark.setTextSize(5.0f);
txtWatermark.setPadding(10, 0, 30, 0);
txtWatermark.setTypeface(FontStyle.OswaldRegular(PreviewActivity.this));
txtWatermark.setTextColor(Color.parseColor("#FF0000"));
rlPreview.addView(imgPreviewRotate);
rlPreview.addView(txtWatermark);
txtWatermark.setVisibility(View.INVISIBLE);

答案 2 :(得分:0)

这是我的错。我找到了解决我自己问题的方法。谢谢你的回答。我使用了错误的位图。
在线 -

 bmp.compress(Bitmap.CompressFormat.JPEG, 100, fOut);

我使用了错误的位图,这就是为什么它不起作用。而不是我必须使用

 result.compress(Bitmap.CompressFormat.JPEG, 100, fOut);

并且在更改上面的线后,它可以作为魅力。

希望它会帮助其他人。