簡體   English   中英

如何在 iOS 中將疊加層和相機圖像組合在一起?

[英]how to combine overlay and camera image together in iOS?

我想開發一個應用程序,用戶可以在其中更改發型。 所以我使用以下代碼文件在相機視圖中添加了一個疊加層,並嘗試合並兩個圖像。

這是我的ViewController.h文件

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIPopoverControllerDelegate>{


    UIImagePickerController *imagePicker;
    UIPopoverController *popoverController;
    NSData *imageData;
}


@property (weak, nonatomic) IBOutlet UIImageView *imageView;


@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
        imagePicker = [[UIImagePickerController alloc] init];



        imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
        imagePicker.cameraDevice = UIImagePickerControllerCameraDeviceFront;
        imagePicker.delegate = self;




        imagePicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
        imagePicker.navigationBarHidden = YES;
        imagePicker.toolbarHidden = YES;
        imagePicker.extendedLayoutIncludesOpaqueBars = YES;


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

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




        [overlayView addSubview:overlayImage];

        // 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!

    [self presentViewController:imagePicker animated:YES
                     completion:^ {
                         [imagePicker takePicture];
                     }];

}

- (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 {







    [picker dismissViewControllerAnimated:YES completion:NULL];

    [popoverController dismissPopoverAnimated: YES];

    NSData *image1 =   UIImageJPEGRepresentation([editingInfo valueForKey:UIImagePickerControllerOriginalImage],1.0);



    UIImage *Imgg = [self addOverlayToBaseImage:[editingInfo valueForKey:UIImagePickerControllerOriginalImage]];

    image1 = UIImageJPEGRepresentation(Imgg,1.0);
    imageData   =   image1;


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *imagePath =[documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png",@"cached"]];

    NSLog((@"pre writing to file"));
    if (![imageData writeToFile:imagePath atomically:NO])
    {
        NSLog((@"Failed to cache image data to disk"));
    }
    else
    {

        [[NSUserDefaults standardUserDefaults] setValue:imagePath forKey:@"imagePath"];
        NSLog(@"the cachedImagedPath is %@",imagePath);
    }


    [self.imageView setImage:Imgg];


}


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


- (UIImage*)addOverlayToBaseImage:(UIImage*)baseImage{

    UIImage *overlayImage = [UIImage imageNamed:@"wig.png"];
    CGPoint topCorner = CGPointMake(0, 0);
    CGSize targetSize = CGSizeMake(self.view.frame.size.width, self.view.frame.size.height);
    CGRect scaledRect = CGRectZero;

    CGFloat scaledX = self.view.frame.size.height * baseImage.size.width / baseImage.size.height;
    CGFloat offsetX = (scaledX - self.view.frame.size.width) / -2;

    scaledRect.origin = CGPointMake(offsetX, 0.0);
    scaledRect.size.width  = scaledX;
    scaledRect.size.height = self.view.frame.size.height;

    UIGraphicsBeginImageContext(targetSize);
    [baseImage drawInRect:scaledRect];
    [overlayImage drawAtPoint:topCorner];
    UIImage* result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();    

    return result;  
}

@end

此代碼結合了兩個圖像,但我想要用戶可以在相機預覽中看到的完全相同的圖像。 我的問題是當我捕獲圖像並在 UIImageview 中看到圖像時,它與相機預覽完全不同。


相機預覽圖像

相機預覽圖像

我得到了什么

我得到了什么
幫助我獲得與相機預覽相同的圖像。

我也面臨同樣的問題。 我在這里解決了這個問題你可以找到我完整的 git 回購協議

相機預覽圖像我得到了什么

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM