Android 拍照添加时间水印

效果如下图 :

1、拍照

//          非空判断 拍照
            if (mCamera0 != null){
                mCamera0.takePicture(null, null, jpeg0); // 1 front
            }
            

2、创建JPEG数据回调

    // 创建JPEG图片回调数据对象
    public static PictureCallback jpeg0 = new PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            try {
                // 获得图片
                Bitmap mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
                //添加时间水印
                Bitmap mTimeWatermark = AddTimeWatermark(mBitmap);
                // 判断文件夹是否存在,传入图片存储路径
                CreateFile(StaticVariables.mPicPath);

                String mPath = StaticVariables.mPicPath + System.currentTimeMillis()+".jpeg";       //临时测试命名

                File mFile = new File(mPath);

                BufferedOutputStream mOutputStream = new BufferedOutputStream(new FileOutputStream(mFile));
                // 将图片压缩到流中
                mTimeWatermark.compress(Bitmap.CompressFormat.JPEG,100,mOutputStream);      //时间水印

                mOutputStream.flush();
                mOutputStream.close();

                // 停止预览
                mCamera0.stopPreview();
                mCamera0.release();
                mCamera0 = Camera.open(4);
                Parameters parameters = mCamera0.getParameters();
                // parameters.setPreviewSize(width, height);
                mCamera0.setParameters(parameters);
                mCamera0.setDisplayOrientation(0);

                mCamera0.setPreviewTexture(mTextureView0.getSurfaceTexture());

                // 处理完数据之后预览
                mCamera0.startPreview();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    };

3、添加时间水印:AddTimeWatermark(mBitmap);

    /**
     * 添加时间水印
     * @param mBitmap
     * @return mNewBitmap
     */
    private  Bitmap AddTimeWatermark(Bitmap mBitmap) {
        //获取原始图片与水印图片的宽与高
        int mBitmapWidth = mBitmap.getWidth();
        int mBitmapHeight = mBitmap.getHeight();
      //定义底片 大小 将mBitmap填充  
        Bitmap mNewBitmap = Bitmap.createBitmap(mBitmapWidth, mBitmapHeight, Bitmap.Config.ARGB_8888);
        Canvas mCanvas = new Canvas(mNewBitmap);
        //向位图中开始画入MBitmap原始图片
        mCanvas.drawBitmap(mBitmap,0,0,null);
        //添加文字
        Paint mPaint = new Paint();
        String mFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EEEE").format(new Date());
        //String mFormat = TingUtils.getTime()+"\n"+" 纬度:"+GpsService.latitude+"  经度:"+GpsService.longitude;
        mPaint.setColor(Color.RED);
        mPaint.setTextSize(20);
        //水印的位置坐标
        mCanvas.drawText(mFormat, (mBitmapWidth * 1) / 10,(mBitmapHeight*14)/15,mPaint);
//        mCanvas.save(Canvas.ALL_SAVE_FLAG);
        mCanvas.save();
        mCanvas.restore();

        return mNewBitmap;
    }

4、创建文件夹

    // 创建 文件夹
    public static void CreateFile(String path) {
        File destDir = new File(path);
        if (!destDir.exists()) {
            Log.i(TAG,"文件夹创建成功");
            destDir.mkdirs();
        } else {
            Log.i(TAG,"文件夹已存在");
        }
    }

5、Java 实现添加水印

	/**
	 * 设置文字水印
	 * 
	 * @param sourceImg
	 *            源图片路径
	 * @param targetImg
	 *            保存的图片路径
	 * @param content
	 *            内容
	 * @param font
	 *            水印字体大小
         * Font font = new Font("微软雅黑", Font.BOLD, 16);
	 * @throws IOException
	 */
	public void addWatermark(String sourceImg, String targetImg,String content, Font font) throws IOException {
		
		File srcImgFile = new File(sourceImg);
		Image srcImg = ImageIO.read(srcImgFile);

		int srcImgWidth = srcImg.getWidth(null);
		int srcImgHeight = srcImg.getHeight(null);

		BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight,BufferedImage.TYPE_INT_RGB);
		Graphics2D g = bufImg.createGraphics();
		g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);

		g.setColor(Color.BLACK);
		g.setFont(font);

		if (content.equals("model")) {
			// 添加 设备名、MADE IN
			g.drawString(content, 350, 110);
			g.drawString(mMade, 50, 340);
		} else {
			// 设置水印的坐标 标题
			g.drawString(content, 50, 115);
		}
		g.dispose();

		// 输出图片
		FileOutputStream outImgStream = new FileOutputStream(targetImg);
		ImageIO.write(bufImg, "jpg", outImgStream);
		System.out.println("文字水印添加完成");
		outImgStream.flush();
		outImgStream.close();
	}

 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要给 Android TextureView 添加时间水印,可以通过以下步骤实现: 1. 在布局文件中添加 TextureView,并在代码中获取它的实例: ```java TextureView textureView = findViewById(R.id.texture_view); ``` 2. 创建一个 Bitmap,将水印绘制在 Bitmap 上: ```java Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); canvas.drawColor(Color.BLACK); Paint paint = new Paint(); paint.setColor(Color.WHITE); paint.setTextSize(textSize); canvas.drawText(time, x, y, paint); ``` 其中,width 和 height 是 Bitmap 的宽度和高度;Color.BLACK 是背景颜色;Color.WHITE 是水印文字的颜色;textSize 是水印文字大小;time 是当前时间字符串;x 和 y 是水印文字的位置。 3. 在 TextureView 的 SurfaceTextureListener 的 onSurfaceTextureAvailable 回调方法中获取 Surface 对象,将 Bitmap 绘制在 Surface 上: ```java @Override public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) { Surface surface = new Surface(surfaceTexture); Canvas canvas = surface.lockCanvas(null); canvas.drawBitmap(bitmap, 0, 0, null); surface.unlockCanvasAndPost(canvas); } ``` 4. 在 TextureView 的 SurfaceTextureListener 的 onSurfaceTextureDestroyed 回调方法中释放 Bitmap 和 Surface 对象: ```java @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { bitmap.recycle(); surface.release(); return true; } ``` 这样就可以给 Android TextureView 添加时间水印了。需要注意的是,如果需要动态更新水印时间,可以在每次更新时间时重新绘制 Bitmap,并将其绘制在 Surface 上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值