Как мне сделать точную копию UIImage, возвращенную из UIImagePickerController? - PullRequest
7 голосов
/ 06 октября 2010

У меня расходятся потребности в изображении, возвращаемом с камеры iPhone. Мое приложение масштабирует изображение для загрузки и отображения, и недавно я добавил возможность сохранять изображение в приложении "Фотографии".

Сначала я назначал возвращаемое значение двум отдельным переменным, но оказалось, что они совместно использовали один и тот же объект, поэтому я получал два уменьшенных изображения вместо одного в полном масштабе.

Поняв, что вы не можете сделать UIImage *copyImage = [myImage copy];, я сделал копию, используя imageWithCGImage , как показано ниже. К сожалению, это не работает, потому что копия (здесь croppedImage ) оказывается повернутой на 90º от оригинала.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{   
    // Resize, crop, and correct orientation issues
    self.originalImage = [info valueForKey:@"UIImagePickerControllerOriginalImage"];
    UIImageWriteToSavedPhotosAlbum(originalImage, nil, nil, nil);
    UIImage *smallImage = [UIImage imageWithCGImage:[originalImage CGImage]]; // UIImage doesn't conform to NSCopy

    // This method is from a category on UIImage based on this discussion:
    // http://discussions.apple.com/message.jspa?messageID=7276709
    // It doesn't rotate smallImage, though: while imageWithCGImage returns
    // a rotated CGImage, the UIImageOrientation remains at UIImageOrientationUp!
    UIImage *fixedImage = [smallImage scaleAndRotateImageFromImagePickerWithLongestSide:480];
    ...
}

Есть ли способ скопировать изображение UIImagePickerControllerOriginalImage без изменения его в процессе?

Ответы [ 5 ]

16 голосов
/ 21 июля 2011

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

CGImageRef newCgIm = CGImageCreateCopy(oldImage.CGImage);
UIImage *newImage = [UIImage imageWithCGImage:newCgIm scale:oldImage.scale orientation:oldImage.imageOrientation];
8 голосов
/ 20 июня 2012

Это должно работать:

UIImage *newImage = [UIImage imageWithCGImage:oldImage.CGImage];
3 голосов
/ 07 февраля 2016

Скопируйте вспомогательные данные и поверните их

Этот вопрос задает общий вопрос о UIImage немного по-другому.По сути, у вас есть две связанные проблемы - глубокое копирование и ротация.UIImage - это просто контейнер, имеющий свойство ориентации, которое используется для отображения.UIImage может содержать свои данные поддержки как CGImage или CIImage, но чаще всего как CGImage.CGImage - это структура информации, которая включает указатель на базовые данные, и если вы читаете документы, копирование структуры не копирует данные.Итак ...

Глубокое копирование

Как я выясню в следующем параграфе, при глубоком копировании данные будут поворачиваться, потому что изображение поворачивается в базовых данных.

UIImage *newImage = [UIImage imageWithData:UIImagePNGRepresentation(oldImage)];

Это скопирует данные, но потребует установки свойства ориентации, прежде чем передать его что-то вроде UIImageView для правильного отображения.

Еще один способ глубокого копирования - рисование в контекстезахватить результат.Предположим, что зебра.

UIGraphicsBeginImageContext(zebra!.size)
zebra!.drawInRect(CGRectMake(0, 0, zebra!.size.width, zebra!.size.height))
let copy = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

Глубокое копирование и вращение

Поворот CGImage уже получен ответ.Также бывает, что это повернутое изображение - это новый CGImage, который можно использовать для создания UIImage.

2 голосов
/ 06 октября 2010
UIImage *newImage = [UIImage imageWithData:UIImagePNGRepresentation(oldImage)];
0 голосов
/ 13 августа 2014

Я думаю, вам нужно создать контекст изображения (CGContextRef).Нарисуйте UIImage.CGImage в контексте с помощью метода CGContextDrawImage (...), затем получите изображение из контекста с помощью CGBitmapContextCreateImage (...).С такой рутиной, я уверен, вы сможете получить реальную копию нужного вам изображения.Надеюсь, это помогло тебе.

...