IONIC3 修改拍照插件cordova-plugin-camera-preview 添加水印

一.插件安装

cordova plugin add cordova-plugin-camera-preview
npm install @ionic-native/camera-preview

二.目录说明

1.ionic 插件目录 主要修改入参

2.cordova插件目录 主要修改入参、拍照逻辑

三.源码修改

1.ionic插件修改@awesome-cordova-plugins 增加入参项

修改ngx文件加下的index.d.ts

在 CameraPreviewOptions 中增加需要的参数

2.cordova 插件修改 cordova-plugin-camera-preview

1.增加入参项

  1. 修改typescript文件夹下 CameraPreview.d.ts 的CameraPreviewStartCameraOptions。

※与ionic插件修改一样 入参名称和类型要保持一致。

  1. 修改android文件夹下CameraPreview.java
  1. 在execute()方法中 增加startCamera()方法调用的参数
  1. 在页面回调onRequestPermissionResult() 中 增加startCamera()方法调用的参数

※参数的类型和数组长度要与CameraPreview.d.ts中一致

  1. 在startCamera()方法中把新加的参数传入CameraActivity.java中
4.在CameraActivity.java中增加新入参全局变量

2.修改拍照逻辑 CameraActivity.java

  1. 思路
  • 相机预览时使用画笔Paint 画布Canvas 把水印添加到相机的画面上 做到相机预览时能看到水印

  • 拍照完成后 把水印和照片合并成一个图片返回给ionic

  1. 画水印
private Bitmap setWatermark() {
    int textSize = 32; // 设置字体大小
    int showHeight = height; // 根据相机预览高度来设置水印在屏幕的高度
    String familyName = "宋体"; // 设置字体
    Typeface typeface = Typeface.create(familyName,Typeface.NORMAL);
    String title1 = "时  间";
    String title2 = "地  点";
    String title3 = "天  气";
    String title4 = "拍摄人";
    String title5 = "设  备";
    // width相机预览的宽度 height相机预览的宽度 由ionic传入
    Bitmap newBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas mCanvas = new Canvas(newBitmap);
    if (!isShowWaterMark) { // 如果不显示水印 返回一个空白的画布
      return newBitmap;
    }

    PaintFlagsDrawFilter mSetfil = new PaintFlagsDrawFilter(0,Paint.FILTER_BITMAP_FLAG);
    mCanvas.setDrawFilter(mSetfil);
    // ***加入文字-----------------------------
    Paint textPaint = new Paint();
    textPaint.setColor(Color.WHITE); //设置字体颜色
    textPaint.setTextSize(textSize); //设置字体大小
    textPaint.setTypeface(typeface);
    textPaint.setTextAlign(Paint.Align.LEFT);
    textPaint.setAntiAlias(true); // 字体锯齿
    mCanvas.drawText(title1,  5, showHeight-250, textPaint);
    mCanvas.drawText(title2,  5, showHeight-190, textPaint);
    mCanvas.drawText(title3,  5, showHeight-130, textPaint);
    mCanvas.drawText(title4,  5, showHeight-70, textPaint);
    mCanvas.drawText(title5,  5, showHeight-10, textPaint);
    // ***加入图片-----------------------------
    AssetManager assetManager = getActivity().getAssets();
    InputStream is = null;
    try {
      is = assetManager.open("www/assets/img/cloud.png");
    } catch (IOException e) {
      e.printStackTrace();
    }
    Bitmap bitmap = BitmapFactory.decodeStream(is);
    Bitmap mBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
    mBitmap.setDensity(bitmap.getDensity()*2);// 图片放大比例
    mCanvas.drawBitmap(mBitmap, 5, showHeight-350, null);
    //保存画布
    mCanvas.save(); 
    mCanvas.restore();   
    return newBitmap;
  }
  1. 创建相机预览时把水印添加到前背景上
 private void createCameraPreview(){
    if(mPreview == null) {
      setDefaultCameraId();

      //set box position and size
      FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(width, height);
      layoutParams.setMargins(x, y, 0, 0);
      frameContainerLayout = (FrameLayout) view.findViewById(getResources().getIdentifier("frame_container", "id", appResourcesPackage));
      frameContainerLayout.setLayoutParams(layoutParams);

      //video view
      mPreview = new Preview(getActivity());
      mainLayout = (FrameLayout) view.findViewById(getResources().getIdentifier("video_view", "id", appResourcesPackage));
      mainLayout.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
      mainLayout.addView(mPreview);
      mainLayout.setEnabled(false);
      mainLayout.setForeground(new BitmapDrawable(setWatermark()));// 添加水印
        if(toBack == false) {
            this.setupTouchAndBackButton();
        }

    }
  }
  1. 拍照成功后把水印与图片合并到一起
  • 创建一个新的画布 大小与相机预览的width,height一样

  • 把照片画到画布上

  • 把水印画到画布上

public Bitmap combineBitmap(Bitmap background, Bitmap foreground)
  {
    int bgWidth = background.getWidth();
    int bgHeight = background.getHeight();
    int fgHeight = foreground.getHeight();
    //创建一个新的画布
    Bitmap map = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(map);
    /*因为拍照时设置的图片width  height与画布大小不一致 会出现黑边 所以做了一下等比放大
     * 这会影响图片的清晰度       
     */
    Matrix matrix = new Matrix();
    matrix.postScale((float) width/bgWidth, (float) height/bgHeight);//等比放大
    Bitmap mBitmap = Bitmap.createBitmap(background,0,0,bgWidth,bgHeight,matrix,true);// 画图片
    canvas.drawBitmap(mBitmap, 0, 0, null);
    canvas.drawBitmap(foreground, 1 ,(height - fgHeight), null);// 画水印 (height-fgHeight)相当于画布设置水印高度

    canvas.save();
    canvas.restore();
    return map;
  }
  1. 修改拍照回调jpegPictureCallback把有水印的图片返回给ionic插件就大功告成了
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.JPEG, 100, outputStream);
Bitmap  bitmap2 =  combineBitmap(bitmap, setWatermark());// 合并图片与水印
ByteArrayOutputStream outputStream1 = new ByteArrayOutputStream();
bitmap2.compress(CompressFormat.JPEG, 100, outputStream1);
data = outputStream1.toByteArray();
String encodedImage = Base64.encodeToString(data, Base64.NO_WRAP);
eventListener.onPictureTaken(encodedImage);

四.效果图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ionic侧边栏是一个非常实用的组件,可以让用户轻松地在不同的页面之间进行导航。ion-side-menus是Ionic中用于创建侧边栏的指令,它提供了多个选项来控制侧边栏的外观和功能。 要使用ion-side-menus指令,需要在HTML中创建一个包含ion-side-menus指令的容器元素。然后,在容器中定义一个ion-side-menu-content指令,用于指定主要内容区域。在主要内容区域中,可以使用ion-nav-view指令来显示不同的页面。 在侧边栏中,可以使用ion-side-menu指令来定义侧边栏的内容。可以在侧边栏中包含任意数量的元素,包括列表、按钮和链接等。 当用户在侧边栏中选择一个项目时,可以使用ion-tap指令来处理点击事件。ion-tap指令可以与ng-click指令一起使用,用于在视图中触发特定的函数或操作。 下面是一个示例代码,展示了如何使用ion-side-menus和ion-tap指令来创建一个具有侧边栏导航的Ionic应用: ``` <ion-side-menus> <!-- 左侧侧边栏 --> <ion-side-menu side="left"> <ion-header-bar class="bar-dark"> <h1 class="title">菜单</h1> </ion-header-bar> <ion-content> <ion-list> <ion-item ng-click="openPage('home')">首页</ion-item> <ion-item ng-click="openPage('about')">关于</ion-item> <ion-item ng-click="openPage('contact')">联系我们</ion-item> </ion-list> </ion-content> </ion-side-menu> <!-- 主要内容区域 --> <ion-side-menu-content> <ion-header-bar class="bar-dark"> <button class="button button-icon ion-navicon" ng-click="toggleLeft()"> </button> <h1 class="title">我的应用</h1> </ion-header-bar> <ion-nav-view></ion-nav-view> </ion-side-menu-content> </ion-side-menus> ``` 在上面的代码中,我们创建了一个包含ion-side-menus指令的容器元素。在容器中,我们定义了一个包含ion-side-menu指令的左侧侧边栏,并在其中添加了一些项目。在主要内容区域中,我们使用ion-nav-view指令来显示不同的页面,并使用ion-header-bar指令来添加导航栏。在导航栏中,我们添加了一个按钮,用于打开左侧侧边栏,并使用ion-tap指令来处理点击事件。 最后,我们还需要在控制器中定义一个openPage函数,用于在点击侧边栏中的项目时导航到不同的页面。 ``` .controller('MyCtrl', function($scope, $ionicSideMenuDelegate, $state) { $scope.openPage = function(page) { $ionicSideMenuDelegate.toggleLeft(false); $state.go(page); }; $scope.toggleLeft = function() { $ionicSideMenuDelegate.toggleLeft(); }; }); ``` 在上面的代码中,我们定义了一个openPage函数,用于在点击侧边栏中的项目时导航到不同的页面。我们还定义了一个toggleLeft函数,用于打开或关闭左侧侧边栏。在openPage函数中,我们通过$state.go函数来导航到不同的页面,并在导航完成后关闭左侧侧边栏。在toggleLeft函数中,我们使用$ionicSideMenuDelegate.toggleLeft函数来打开或关闭左侧侧边栏。 总之,使用ion-side-menus和ion-tap指令可以轻松创建具有侧边栏导航的Ionic应用,并实现侧边栏中项目的点击事件处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值