使用Phonegap在iOS上的相机​​预览上叠加图像

时间:2011-09-01 17:27:02

标签: ios camera cordova

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

2 个答案:

答案 0 :(得分:7)

我知道,这有点太晚了,但有办法(仅限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

然后在检查ImagePickerSourceType(第132行)后立即将这些行添加到CDVCamera.m

    if ([cameraPicker.showOverlay intValue] == 1) {
        UIImageView *overlay = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 768, 1024)];
        overlay.contentMode = UIViewContentModeScaleAspectFill;
        overlay.image = [UIImage imageNamed:@"overlay.png"];
    }

不要忘记在CDVCamera.m中导入子类CameraPicker #import "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
                    }); 

答案 1 :(得分:2)

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

相反,我找到了一个更简单的解决方案。在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执行叠加非常重要。