iOS: обрезка неподвижного изображения, полученного с камеры UIImagePickerController, с наложением - PullRequest
7 голосов
/ 13 декабря 2011

Я новичок в iOS, и вот уже на прошлой неделе я бьюсь головой об стену, ища в Интернете учебники, такие как: Работа с изображениями Exif , Изменение размера изображений и много других случайных вопросов здесь, на StackOverflow. Из них я понял, что >=iOS 4.0, все изображения, снятые с камеры, содержат информацию о вращении на основе EXIF.

Что не работает: После того, как я попробовал различные методы обрезки изображения, все, что я в итоге получаю, это обрезка изображения в некоторых случайных углах, а также, полученное изображение кажется увеличенным :( Когда я использую png изображение из Интернета (которое не содержит данных EXIF), обрезка работает.Я имею в виду случайные углы, я имею в виду - изображение обрезается в верхнем правом / верхнем левом углу и увеличивается.

Чего я пытаюсь достичь:
Я пытаюсь обрезать изображение 100 px сверху и 100 px снизу. По сути, я использую две накладные полосы - 1 сверху и 1 снизу с полосой высотой CGRect(0.0, 0.0, SCREEN_WIDTH, 100.0) [100.0 px вверху] и другой полосой CGRect(0.0, SCREEN_HEIGHT - 100, SCREEN_WIDTH, 100.0) [еще одну 100 px высоту внизу ]. Мне нужно получить изображение между этими двумя полосами: я предполагаю, что высота изображения: SCREEN_HEIGHT - 200.0.

Отображение UIImagePickerController для камеры с наложением:


    //SCREEN_HEIGHT = 480 and SCREEN_WIDTH = 320
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == NO) 
    {
        NSLog(@"Camera not available");
        return;
    }

    imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    imagePicker.delegate = self;
    imagePicker.allowsEditing = NO;


    // Hide the controls
    imagePicker.showsCameraControls = NO;
    imagePicker.navigationBarHidden = YES;

    // Make camera view full screen
    imagePicker.wantsFullScreenLayout = YES;
    //imagePicker.cameraViewTransform = CGAffineTransformScale(imagePicker.cameraViewTransform, CAMERA_TRANSFORM_X, CAMERA_TRANSFORM_Y);


    //Overlay
    //OverlayView is a plain UIView with the CGRects mentioned in the question.
    OverlayView *overlay = [[OverlayView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)]; 
    [overlay initOverlay:self];
    imagePicker.cameraOverlayView = overlay;
    [self presentModalViewController:imagePicker animated:YES];

Код для поворота изображения на основе свойства EXIF ​​imageOrientation и его обрезка


- (UIImage *) cropImage: (UIImage *) originalImage 
{

    CGRect cropRect = CGRectMake(0, 100.0, SCREEN_WIDTH, SCREEN_HEIGHT - 100);

    CGRect transformedRect = [self TransformCGRectForUIImageOrientation:cropRect :originalImage.imageOrientation :originalImage.size];

    CGImageRef resultImageRef = CGImageCreateWithImageInRect(originalImage.CGImage, transformedRect);

    UIImage *newImage = [[[UIImage alloc] initWithCGImage:resultImageRef scale:1.0 orientation:originalImage.imageOrientation] autorelease];

    return newImage;
}

- (CGRect) TransformCGRectForUIImageOrientation: (CGRect) source: (UIImageOrientation) orientation: (CGSize) imageSize {

    switch (orientation) {
        case UIImageOrientationLeft: { // EXIF #8
            CGAffineTransform txTranslate = CGAffineTransformMakeTranslation(
                                                                             imageSize.height, 0.0);
            CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate,
                                                                   M_PI_2);
            return CGRectApplyAffineTransform(source, txCompound);
        }
        case UIImageOrientationDown: { // EXIF #3
            CGAffineTransform txTranslate = CGAffineTransformMakeTranslation(
                                                                             imageSize.width, imageSize.height);
            CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate,
                                                                   M_PI);
            return CGRectApplyAffineTransform(source, txCompound);
        }
        case UIImageOrientationRight: { // EXIF #6
            CGAffineTransform txTranslate = CGAffineTransformMakeTranslation(
                                                                             0.0, imageSize.width);
            CGAffineTransform txCompound = CGAffineTransformRotate(txTranslate,
                                                                   M_PI + M_PI_2);
            return CGRectApplyAffineTransform(source, txCompound);
        }
        case UIImageOrientationUp: // EXIF #1 - do nothing
        default: // EXIF 2,4,5,7 - ignore
            return source;
    }


Метод cropImage, кажется, работает для изображений, загруженных из Интернета (которые не содержат информации об ориентации). У меня заканчиваются варианты. Может ли кто-нибудь, пожалуйста, помогите мне?

Спасибо за чтение!

1 Ответ

17 голосов
/ 14 декабря 2011

Когда вы можете, проще пропустить рисование изображений с Core Graphics:

- (UIImage *)cropImage:(UIImage *)oldImage {
    CGSize imageSize = oldImage.size
    UIGraphicsBeginImageContextWithOptions( CGSizeMake( imageSize.width,
                                                        imageSize.height - 200),
                                            NO,
                                            0.);
    [oldImage drawAtPoint:CGPointMake( 0, -100)
                blendMode:kCGBlendModeCopy
                    alpha:1.];
    UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return croppedImage;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...