相机叠加图片 [英] camera overlay picture

查看:99
本文介绍了相机叠加图片的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

编辑3



好消息和坏消息。好消息是在Connections Inspector中通过断开覆盖UIToolbar并连接UIImageview,我看到 theKing ,但后来 - 坏消息 - 我看不到UIToolbar,我也需要它。所以现在的问题是,当用户在这里完成时,用户如何回到调用VC?如何将工具栏和图像都作为叠加层的一部分,或者返回按钮工具栏是否可以位于非叠加视图上,或者其他什么?或者如何在OverlayViewController上显示工具栏和图像?



编辑3



编辑2



setupImagePicker in OverlayViewController.m

   - (void)setupImagePicker:(UIImagePickerControllerSourceType)sourceType 
{
self.imagePickerController.sourceType = sourceType;

if(sourceType == UIImagePickerControllerSourceTypeCamera)
{
//用户想要使用相机界面
//
self.imagePickerController.showsCameraControls = NO ;

if([[self.imagePickerController.cameraOverlayView subviews] count] == 0)
{
//为相机设置我们的自定义叠加视图
//
//确保我们的自定义视图框架适合父框架
CGRect overlayViewFrame = self.imagePickerController.cameraOverlayView.frame;
CGRect newFrame = CGRectMake(0.0,
CGRectGetHeight(overlayViewFrame) -
self.view.frame.size.height - 10.0,
CGRectGetWidth(overlayViewFrame),
self .view.frame.size.height + 10.0);
self.view.frame = newFrame;
[self.imagePickerController.cameraOverlayView addSubview:self.view];
}
}
}

编辑2



编辑1





ViewController.h



  #import< ; UIKit的/ UIKit.h> 

@interface ViewController:UIViewController< UIImagePickerControllerDelegate,UINavigationControllerDelegate>

@end



ViewController.m



  #importViewController.h

@interface ViewController()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

//为按钮分配操作
UIButton * myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
myButton.frame = CGRectMake(0,0,200,60);
myButton.center = self.view.center;
[myButton addTarget:self action:@selector(buttonPress :) forControlEvents:UIControlEventTouchUpInside];
[myButton setTitle:@Image PickerforState:UIControlStateNormal];

[self.view addSubview:myButton];
}

- (void)buttonPress:(id)sender {
if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){

// alert无法访问摄像机的用户
UIAlertView * noCameraAlert = [[UIAlertView alloc] initWithTitle:@No Camera消息:@无法访问摄像机! delegate:nil cancelButtonTitle:@DismissotherButtonTitles:nil,nil];
[noCameraAlert show];

} else {

//准备imagePicker视图
UIImagePickerController * imagePicker = [[UIImagePickerController alloc] init];
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.delegate = self;
imagePicker.allowsEditing = NO;
imagePicker.showsCameraControls = NO;

//为overlay创建视图
CGRect overlayRect = CGRectMake(0,0,imagePicker.view.frame.size.width,imagePicker.view.frame.size.height);
UIView * overlayView = [[UIView alloc] initWithFrame:overlayRect];

//准备图像覆盖
UIImageView * overlayImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@theKing]];
overlayImage.center = overlayView.center;
overlayImage.alpha = 0.5;

//为叠加层准备工具栏
UIToolbar * overlayToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0,600,overlayView.frame.size.width,40)];
overlayToolbar.center = CGPointMake(overlayView.center.x,overlayView.frame.size.height - 20);
overlayToolbar.barStyle = UIBarStyleBlack;

UIBarButtonItem * takePictureButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(takePictureButtonPressed :)];
UIBarButtonItem * flexibleBarSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
flexibleBarSpace.width = 1000;
UIBarButtonItem * startStopButton = [[UIBarButtonItem alloc] initWithTitle:@Snap样式:UIBarButtonItemStyleBordered target:self action:@selector(startStopButtonPressed :)];
UIBarButtonItem * timedButton = [[UIBarButtonItem alloc] initWithTitle:@Timedstyle:UIBarButtonItemStyleBordered target:self action:@selector(timedButtonPressed :)];
UIBarButtonItem * cancelButton = [[UIBarButtonItem alloc] initWithTitle:@取消样式:UIBarButtonItemStyleBordered target:self action:@selector(cancelButtonPressed :)];

overlayToolbar.items = [NSArray arrayWithObjects:takePictureButton,flexibleBarSpace,startStopButton,timedButton,cancelButton,nil];


[overlayView addSubview:overlayImage];
[overlayView addSubview:overlayToolbar];

//将图像添加为叠加
[imagePicker setCameraOverlayView:overlayView];

// display imagePicker
[self.navigationController presentViewController:imagePicker animated:YES completion:nil];
}
}

#pragma mark - UIBarButton选择器

- (void)takePictureButtonPressed:(id)sender {
NSLog(@ takePictureButtonPressed ......);
// TODO:拍照!
}

- (void)startStopButtonPressed:(id)sender {
NSLog(@startStopButtonPressed ...);
// TODO:让它做点什么
}

- (void)timedButtonPressed:(id)sender {
NSLog(@timedButtonPressed ...) ;
// TODO:在调用takePictureButtonPressed之前实现计时器
}

- (void)cancelButtonPressed:(id)sender {
NSLog(@cancelButtonPressed);
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
}

#pragma mark - UIImagePickerController委托方法

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)editingInfo {

//确定用户是选择还是拍了一张新照片
UIImage * selectedImage;
if([editingInfo objectForKey:UIImagePickerControllerOriginalImage])selectedImage =(UIImage *)[editingInfo objectForKey:UIImagePickerControllerOriginalImage];
else if([editingInfo objectForKey:UIImagePickerControllerEditedImage])selectedImage =(UIImage *)[editingInfo objectForKey:UIImagePickerControllerEditedImage];

// TODO:用selectedImage做一些事情(把它放在UIImageView中

//关闭imagePicker
[picker.presentingViewController dismissViewControllerAnimated:YES completion:nil] ;
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
//处置可以重新创建的任何资源。
}

@end



截图



这就是我运行时的样子。



这是否满足您的应用程序要求?


edit 3

Good news and bad news. The good news is that in the Connections Inspector by disconnecting the overlay UIToolbar and connecting the UIImageview, I see theKing, but then -- the bad news -- I do not see the UIToolbar, which I also need. So the question now is, how can the user get back to the calling VC when s/he is finished here? How can both the toolbar and the image be part of the the overlay, or can the "go back button" toolbar be on the non-overlay view, or something? Or how can I make both the toolbar and the image show on the OverlayViewController?

edit 3

edit 2

setupImagePicker in OverlayViewController.m.

- (void)setupImagePicker:(UIImagePickerControllerSourceType)sourceType
{
    self.imagePickerController.sourceType = sourceType;

    if (sourceType == UIImagePickerControllerSourceTypeCamera)
    {
        // user wants to use the camera interface
        //
        self.imagePickerController.showsCameraControls = NO;

        if ([[self.imagePickerController.cameraOverlayView subviews] count] == 0)
        {
            // setup our custom overlay view for the camera
            //
            // ensure that our custom view's frame fits within the parent frame
            CGRect overlayViewFrame = self.imagePickerController.cameraOverlayView.frame;
            CGRect newFrame = CGRectMake(0.0,
                                         CGRectGetHeight(overlayViewFrame) -
                                         self.view.frame.size.height - 10.0,
                                         CGRectGetWidth(overlayViewFrame),
                                         self.view.frame.size.height + 10.0);
            self.view.frame = newFrame;
            [self.imagePickerController.cameraOverlayView addSubview:self.view];
        }
    }
}

edit 2

edit 1

This is the PhotoPicker sample code link.

edit 1

edit 0

Has anyone tried this on an iPhone instead of an iPad? I do not have an iPhone, but I was reading Matt Neuburg's book today where he says UIImagePicker works differently on the 2 devices.

edit 0

I cannot see the image I am attempting to overlay across the camera view in UIImagePicker. No matter how I add the IBOutlet, as a property or not, the image does not show, but the overlayed toolbar shows fine. Why?

OverlayViewController.h with theKing IBOutlet added to Apple's sample code and then commented out for now.

#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioServices.h>

@protocol OverlayViewControllerDelegate;

@interface OverlayViewController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate>
{
    // IBOutlet UIImageView* theKing;   ******** temporarily commented out
    id <OverlayViewControllerDelegate> delegate;
}    

@property (nonatomic, assign) id <OverlayViewControllerDelegate> delegate;
@property (nonatomic, retain) UIImagePickerController *imagePickerController;

- (void)setupImagePicker:(UIImagePickerControllerSourceType)sourceType;

@end

@protocol OverlayViewControllerDelegate
- (void)didTakePicture:(UIImage *)picture;
- (void)didFinishWithCamera;
@end

OverlayViewController.m with the property for theKing IBOutlet added to Apple's sample code.

#import "OverlayViewController.h"

enum
{
    kOneShot,       // user wants to take a delayed single shot
    kRepeatingShot  // user wants to take repeating shots
};

@interface OverlayViewController ( )

@property (assign) SystemSoundID tickSound;

@property (nonatomic, retain) IBOutlet UIImageView* theKing;  // added *********
@property (nonatomic, retain) IBOutlet UIBarButtonItem *takePictureButton;
@property (nonatomic, retain) IBOutlet UIBarButtonItem *startStopButton;
@property (nonatomic, retain) IBOutlet UIBarButtonItem *timedButton;
@property (nonatomic, retain) IBOutlet UIBarButtonItem *cancelButton;

@property (nonatomic, retain) NSTimer *tickTimer;
@property (nonatomic, retain) NSTimer *cameraTimer;

I cannot see the image theKing when I execute the code on an iPhone. Below is a view of the nib I have added showing some of the connections made. No errors are thrown, but I cannot see the image, only the UIToolbar already added.

解决方案

Update

I've updated it now and tried to replicate what you've done in your question. I've included full source of .h/.m and theKing@2x.png. Create a new project and paste the source into the files and add theKing@2x.png. Everything is done programmatically - you don't need to set anything up in interface builder other than embedding your view in a navigation controller.

Here is theKing@2x.png - http://i.imgur.com/0DrM7si.png

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate> 

@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // assign action to button
    UIButton *myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    myButton.frame = CGRectMake(0, 0, 200, 60);
    myButton.center = self.view.center;
    [myButton addTarget:self action:@selector(buttonPress:) forControlEvents:UIControlEventTouchUpInside];
    [myButton setTitle:@"Image Picker" forState:UIControlStateNormal];

    [self.view addSubview:myButton];
}

- (void)buttonPress:(id)sender {
    if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

        // alert the user that the camera can't be accessed
        UIAlertView *noCameraAlert = [[UIAlertView alloc] initWithTitle:@"No Camera" message:@"Unable to access the camera!" delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil, nil];
        [noCameraAlert show];

    } else {

        // prepare imagePicker view
        UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
        imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
        imagePicker.delegate = self;
        imagePicker.allowsEditing = NO;
        imagePicker.showsCameraControls = NO;

        // create view for overlay
        CGRect overlayRect = CGRectMake(0, 0, imagePicker.view.frame.size.width, imagePicker.view.frame.size.height);
        UIView *overlayView = [[UIView alloc] initWithFrame:overlayRect];

        // prepare the image to overlay
        UIImageView *overlayImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"theKing"]];
        overlayImage.center = overlayView.center;
        overlayImage.alpha = 0.5;

        // prepare toolbar for overlay
        UIToolbar *overlayToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 600, overlayView.frame.size.width, 40)];
        overlayToolbar.center = CGPointMake(overlayView.center.x, overlayView.frame.size.height - 20);
        overlayToolbar.barStyle = UIBarStyleBlack;

        UIBarButtonItem *takePictureButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(takePictureButtonPressed:)];
        UIBarButtonItem *flexibleBarSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
        flexibleBarSpace.width = 1000;
        UIBarButtonItem *startStopButton = [[UIBarButtonItem alloc] initWithTitle:@"Snap" style:UIBarButtonItemStyleBordered target:self action:@selector(startStopButtonPressed:)];
        UIBarButtonItem *timedButton = [[UIBarButtonItem alloc]initWithTitle:@"Timed" style:UIBarButtonItemStyleBordered target:self action: @selector(timedButtonPressed:)];
        UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action: @selector(cancelButtonPressed:)];

        overlayToolbar.items = [NSArray arrayWithObjects:takePictureButton, flexibleBarSpace, startStopButton, timedButton, cancelButton, nil];


        [overlayView addSubview:overlayImage];
        [overlayView addSubview:overlayToolbar];

        // add the image as the overlay
        [imagePicker setCameraOverlayView:overlayView];

        // display imagePicker
        [self.navigationController presentViewController:imagePicker animated:YES completion:nil];
    }
}

#pragma mark - UIBarButton Selectors

- (void)takePictureButtonPressed:(id)sender {
    NSLog(@"takePictureButtonPressed...");
    // TODO: take picture!
}

- (void)startStopButtonPressed:(id)sender {
    NSLog(@"startStopButtonPressed...");
    // TODO: make this do something
}

- (void)timedButtonPressed:(id)sender {
    NSLog(@"timedButtonPressed...");
    // TODO: implement timer before calling takePictureButtonPressed
}

- (void)cancelButtonPressed:(id)sender {
    NSLog(@"cancelButtonPressed");
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
}

#pragma mark - UIImagePickerController Delegate Methods

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)editingInfo {

    // determine if the user selected or took a new photo
    UIImage *selectedImage;
    if ([editingInfo objectForKey:UIImagePickerControllerOriginalImage]) selectedImage = (UIImage *)[editingInfo objectForKey:UIImagePickerControllerOriginalImage];
    else if ([editingInfo objectForKey:UIImagePickerControllerEditedImage]) selectedImage = (UIImage *)[editingInfo objectForKey:UIImagePickerControllerEditedImage];

    // TODO: Do something with selectedImage (put it in a UIImageView

    // dismiss the imagePicker
    [picker.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

Screenshot

This is what it looks like when I run it.

Does this satisfy your app requirements?

这篇关于相机叠加图片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆