Android 拍照新增時間水印

陽光燦爛的夜發表於2018-09-30

效果如下圖 :

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();
	}

 

相關文章