使用Phonegap在iOS上覆盖摄像头预览图像

使用Phonegap在iOS上覆盖摄像头预览图像,ios,camera,cordova,Ios,Camera,Cordova,我期待创建一个应用程序,其中一个半透明的图像是覆盖在相机预览。我知道他们的本地Phonegap摄像头api不支持这一点。我想知道是否有人谁有一些编写Phonegap插件的经验可以给我任何建议,这是否可能与插件。我想我已经看到这种技术可以通过本机代码实现,所以在我看来,编写一个Phonegap插件来访问此功能是可能的,我只是没有任何使用Phonegap插件的经验。我知道,这有点太晚了,但还是有办法的(仅限iPad)。您可以使用标准的org.apache.cordova.camera-插件。但你必须

我期待创建一个应用程序,其中一个半透明的图像是覆盖在相机预览。我知道他们的本地Phonegap摄像头api不支持这一点。我想知道是否有人谁有一些编写Phonegap插件的经验可以给我任何建议,这是否可能与插件。我想我已经看到这种技术可以通过本机代码实现,所以在我看来,编写一个Phonegap插件来访问此功能是可能的,我只是没有任何使用Phonegap插件的经验。

我知道,这有点太晚了,但还是有办法的(仅限iPad)。您可以使用标准的
org.apache.cordova.camera
-插件。但你必须稍微调整一下

首先,对CDVCameraPicker子类进行分类,以便您可以通过cordova api切换覆盖:

CDVCameraPicker+Overlay.h:

#import "CDVCamera.h"

@interface CDVCameraPicker (Overlay)
@property (nonatomic, strong) id showOverlay;
@end
CDVCameraPicker+Overlay.m:

#import "CDVCameraPicker+Overlay.h"
#import <objc/runtime.h>

static void *overlayKey;

@implementation CDVCameraPicker (Overlay)
@dynamic showOverlay;

- (void) setShowOverlay:(id)showOverlay {
    objc_setAssociatedObject(self, overlayKey, showOverlay, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (id) showOverlay {
    return objc_getAssociatedObject(self, overlayKey);
}
@end
别忘了在CDVCamera.m中导入子类CameraPicker
#导入“CDVCameraPicker+Overlay.h”

不,您必须编辑
Camera.js
-文件 将此行添加到其他选项下面

var showOverlay = getValue(options.showOverlay, false);
然后在最后一个索引中将
var
添加到
args
-数组中。就这样。现在,您可以按如下方式切换覆盖:

       navigator.camera.getPicture(onSuccess, onFail, { quality: 40,
                        destinationType: Camera.DestinationType.FILE_URI,
                        sourceType: Camera.PictureSourceType.CAMERA,
                        encodingType: Camera.EncodingType.JPEG,
                        correctOrientation: true,
                        saveToPhotoAlbum: true,
                        showOverlay: false
                    }); 

我尝试了被接受的答案,但不幸的是对我不起作用

相反,我找到了一个更简单的解决方案。在
CDVCamera.m
中:

  + (instancetype) createFromPictureOptions(CDVPictureOptions*)pictureOptions;{

      CDVCameraPicker* cameraPicker = [[CDVCameraPicker alloc] init];
      cameraPicker.pictureOptions = pictureOptions;
      cameraPicker.sourceType = pictureOptions.sourceType;
      cameraPicker.allowsEditing = pictureOptions.allowsEditing;

if (cameraPicker.sourceType == UIImagePickerControllerSourceTypeCamera) {
    // More code...

         // Here is where you place your overlay.
         dispatch_async(dispatch_get_main_queue(), ^{
            UIImageView *overlayImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
            overlayImage.frame = CGRectMake(0, 0, 768, 1024);
            [cameraPicker.cameraOverlayView addSubview:overlayImage];
            [cameraPicker setCameraOverlayView:overlayImage];
     });

   //  Code left out for brevity
   }
}

使用Grand Central Dispatch执行覆盖非常重要。

我正在寻找相同的内容。。。你发现过什么吗?这并不能完全回答问题,但值得一看:。源代码位于底部,它基于phonegap。这是一个有点旧的源代码,来自一个长期完成的项目(或已放弃的项目,我不记得了),但我想花时间感谢您提供了这个深入的答案。我可能需要在未来再次,我相信它会派上用场@我试过这个,但没用。你知道最新版本的Cordova是否仍然适用?我可以获得覆盖图像的唯一方法是在CDVCamera.m中第685行附近的“if(cameraPicker.sourceType==UIImagePickerControllerSourceTypeCamera)”。我使用这行代码
UIImageView*overlayImage=[[UIImageView alloc]initWithImage:[UIImage-imagename:@“myImage”];overlayImage.frame=CGRectMake(0,07681024);cameraPicker.cameraOverlayView=overlayImage问题是加载或根本不加载需要10秒。@tmartineau如果你有一个示例项目,我很想看看。@paul我从来没有尝试过这个。正如我在评论中所说,最初的问题是几年前的一个早已过时的项目。matthisb可能会给你一些见解,因为这是他的答案。对不起,我现在帮不上什么忙了。@tmartineau对此表示抱歉。我本想对马提斯讲话的。不过我确实想出来了。我将在这里发布代码作为答案。
  + (instancetype) createFromPictureOptions(CDVPictureOptions*)pictureOptions;{

      CDVCameraPicker* cameraPicker = [[CDVCameraPicker alloc] init];
      cameraPicker.pictureOptions = pictureOptions;
      cameraPicker.sourceType = pictureOptions.sourceType;
      cameraPicker.allowsEditing = pictureOptions.allowsEditing;

if (cameraPicker.sourceType == UIImagePickerControllerSourceTypeCamera) {
    // More code...

         // Here is where you place your overlay.
         dispatch_async(dispatch_get_main_queue(), ^{
            UIImageView *overlayImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
            overlayImage.frame = CGRectMake(0, 0, 768, 1024);
            [cameraPicker.cameraOverlayView addSubview:overlayImage];
            [cameraPicker setCameraOverlayView:overlayImage];
     });

   //  Code left out for brevity
   }
}