Съемка с камеры и показ ее в UIImageView - PullRequest
1 голос
/ 19 октября 2011

У меня есть вид с некоторыми полями (имя, цена, категория) и сегментированный элемент управления, плюс эта кнопка для съемки.
Если я попробую это на симуляторе (без камеры), он будет работать правильно: я могу выбрать изображение из рулона камеры, отредактировать его и вернуться к представлению, в котором будут показаны все поля с их содержимым.
Но на моем iphone, когда я выбираю изображение после редактирования и возвращаюсь к представлению, все поля пусты, кроме UIImageView.
Я также пытался сохранить содержимое полей в переменных и вставил их обратно в методе "viewWillApper", но приложение вылетает.
Начните думать, что, возможно, что-то не так, методы ниже

EDIT

Я нашел решение здесь . Я определил новый метод для класса UIImage. (перейдите по ссылке для получения дополнительной информации).
Затем я работал над рамкой UIImageView, чтобы приспособиться к новому измерению, в альбомной или портретной ориентации.

-(IBAction)takePhoto:(id)sender {
    if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) {
        self.imgPicker.sourceType = UIImagePickerControllerSourceTypeCamera;
        self.imgPicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
    } else { 
        imgPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    }
    [self presentModalViewController:self.imgPicker animated:YES];
}

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    [picker dismissModalViewControllerAnimated:YES];

    NSDate *date = [NSDate date];
    NSString *photoName = [dateFormatter stringFromDate:date];    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUs    erDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    imagePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", photoName]];

    UIImage *picture = [info objectForKey:UIImagePickerControllerOriginalImage];

    // ---------RESIZE CODE--------- //
    if (picture.size.width == 1936) {
        picture = [picture scaleToSize:CGSizeMake(480.0f, 720.0f)];
    } else {
        picture = [picture scaleToSize:CGSizeMake(720.0f, 480.0f)];
    }
    // --------END RESIZE CODE-------- //

    photoPreview.image =  picture;

    // ---------FRAME CODE--------- //
    photoPreview.contentMode = UIViewContentModeScaleAspectFit;
    CGRect frame = photoPreview.frame;
    if (picture.size.width == 480) {
        frame.size.width = 111.3;
        frame.size.height =167;
    } else {
        frame.size.width = 167;
        frame.size.height =111.3;
    }
    photoPreview.frame = frame;
    // --------END FRAME CODE-------- //


    NSData *webData = UIImagePNGRepresentation(picture);
    CGImageRelease([picture CGImage]);
    [webData writeToFile:imagePath atomically:YES];
    imgPicker = nil;
}

Теперь у меня новый выпуск! Если я делаю снимок в альбомной ориентации и пытаюсь сделать еще один в портретной ориентации, приложение вылетает. Должен ли я что-то выпустить?

Ответы [ 2 ]

3 голосов
/ 19 октября 2011

У меня была такая же проблема, при использовании камеры отредактированное изображение отсутствует, необходимо использовать исходное изображение:

originalimage = [editingInfo objectForKey:UIImagePickerControllerOriginalImage];

if ([editingInfo objectForKey:UIImagePickerControllerMediaMetadata]) {
    // test to chek that the camera was used
    // especially I fund out htat you then have to rotate the photo
    ...

Если он был обрезан при создании альбома, вы, конечно же, должны заново его обрезать:

if ([editingInfo objectForKey:UIImagePickerControllerCropRect] != nil) {
    CGRect cropRect = [[editingInfo objectForKey:UIImagePickerControllerCropRect] CGRectValue];
    CGImageRef imageRef = CGImageCreateWithImageInRect([originalimage CGImage], cropRect);
    chosenimage = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef);
} else {
    chosenimage = originalimage;
}

Информация о кадрировании также присутствует для режима камеры, вам нужно проверить, как вы хотите, чтобы она себя вел.

0 голосов
/ 19 октября 2011

Чтобы обрезать изображение, я думаю, что это может помочь вам

UIImage *croppedImage = [self imageByCropping:photo.image toRect:tempview.frame];

CGSize size = CGSizeMake(croppedImage.size.height, croppedImage.size.width);
UIGraphicsBeginImageContext(size);

CGPoint pointImg1 = CGPointMake(0,0);
[croppedImage drawAtPoint:pointImg1 ];

[[UIImage imageNamed:appDelegete.strImage] drawInRect:CGRectMake(0,532, 150,80) ];

UIImage* result = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
croppedImage = result;

UIImageView *mainImageView = [[UIImageView alloc] initWithImage:croppedImage];

CGRect clippedRect = CGRectMake(0, 0, croppedImage.size.width,  croppedImage.size.height);

CGFloat scaleFactor = 0.5;

UIGraphicsBeginImageContext(CGSizeMake(croppedImage.size.width * scaleFactor, croppedImage.size.height * scaleFactor));
CGContextRef currentContext = UIGraphicsGetCurrentContext();

CGContextClipToRect(currentContext, clippedRect);   

//this will automatically scale any CGImage down/up to the required thumbnail side (length) when the CGImage gets drawn into the context on the next line of code
CGContextScaleCTM(currentContext, scaleFactor, scaleFactor);

[mainImageView.layer renderInContext:currentContext];

appDelegete.appphoto = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();
...