Android 水印相机开发

水印相机是自定义相机的一种,实现方法有很多,我看了很多别人的做的很漂亮,我做的就很普通了,不过总算是实现了拍照加水印的功能。

我这边用到了SurfaceView,有人没用这个也做出来水印相机,个人觉得还是SurfaceView更方便一点(不接受反驳)。

先看看效果:
效果图
原图太大,我做了压缩,所以动图显得模糊。

第一步,我们想一进入就打开相机预览,这个怎么做呢?
相机功能由android.hardware.Camera类实现,但是需要有一个预览载体,这里就用SurfaceView,而且需要辅助类SurfaceHolder,首先,我们的 Activity 要实现SurfaceHolder.Callback接口:

public class WaterCameraActivity extends AppCompatActivity implements SurfaceHolder.Callback

第二步,关联SurfaceHolder

        private SurfaceView mSv;
        private SurfaceHolder mSurfaceHolder;
        mSurfaceHolder = mSv.getHolder();
        mSurfaceHolder.setKeepScreenOn(true);
        mSurfaceHolder.setFormat(PixelFormat.TRANSPARENT);
        mSurfaceHolder.addCallback(this);
        // 为了实现照片预览功能,需要将SurfaceHolder的类型设置为PUSH,这样画图缓存就由Camera类来管理,画图缓存是独立于Surface的
        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

实现SurfaceHolder.Callback接口有三个方法需要重写:

   @Override
    public void surfaceCreated(SurfaceHolder holder) {
   
        
    }
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
   

    }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
   

    }

只要SurfaceView显示,就会调用surfaceCreated(),不显示就会调用surfaceDestroyed()。因此可以在surfaceCreated()中初始化相机,并展示预览界面;在surfaceDestroyed()中释放相机资源。
第三步,初始化相机

            mCamera = Camera.open(0);//0-后摄像头,1-前摄像头
            Camera.getCameraInfo(0, cameraInfo);
            Camera.Parameters parameters = mCamera.getParameters();
            // 设置图片格式
            parameters.setPictureFormat(ImageFormat.JPEG);
            // 设置照片质量
            parameters.setJpegQuality(100);
            // 首先获取系统设备支持的所有颜色特效,如果设备不支持颜色特性将返回一个null, 如果有符合我们的则设置
            List<String> colorEffects = parameters.getSupportedColorEffects();
            Iterator<String> colorItor = colorEffects.iterator();
            while (colorItor.hasNext()) {
   
                String currColor = colorItor.next();
                if (currColor.equals(Camera.Parameters.EFFECT_SOLARIZE)) {
   
                    parameters.setColorEffect(Camera.Parameters.EFFECT_AQUA);
                    break;
                }
            }
            // 获取对焦模式
            List<String> focusModes 
### 开发带有水印功能的相机应用 #### 方法概述 在Android平台开发带有水印功能的相机应用程序涉及几个关键技术点。通过调用系统的相机接口来捕获图像,并使用`Canvas`和`Paint`对象处理位图,在指定的位置绘制文字或其他形式的水印。 #### 实现细节 对于创建具有水印的照片,可以采用如下方式: - **初始化画笔** 定义一个`Paint`实例用于配置水印样式,比如字体的颜色、尺寸等参数[^2]。 ```java Paint paint = new Paint(); paint.setColor(Color.WHITE); paint.setTextSize(40f); ``` - **加载原始图片并转换成Bitmap** 当用户完成拍照后,程序会接收到一张未加工过的照片作为输入,此时需将其转化为`Bitmap`以便后续编辑[^3]. - **创建Canvas对象** 基于上述得到的`Bitmap`创建一个新的`Canvas`实例,这允许开发者在这个图形上下文中执行绘图命令. ```java Bitmap bitmap = ...; // 获取到的原图bitmap Canvas canvas = new Canvas(bitmap); ``` - **绘制水印** 利用之前准备好的`Paint`工具,在目标区域写入想要显示的文字内容,如时间戳或者版权信息等. ```java String watermarkText = "拍摄账号:" + account; canvas.drawText(watermarkText, xPosition, yPosition, paint); ``` - **保存修改后的图片** 经过以上步骤处理完毕之后,就可以把最终含有水印标记的新版本图片保存下来了. 另外一种更高级别的解决方案是借助第三方库的帮助,例如引用中的WmCameraLauncher提供了更加便捷的方法来进行此类操作,它不仅支持简单的静态水印添加,还能够灵活调整水印的位置、设定输出路径以及选择不同的视频分辨率等等特性[^4]: ```java // 启动照相界面 WmCameraLauncher.startPhoto(activity, null /*byteArr*/, Gravity.BOTTOM | Gravity.END/*gravity*/, "/sdcard/output_path.jpg" /*outPath*/, VideoResolution.HD_720P /*resolution*/); ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值