вращать CGImage на диске, используя CGImageSource / CGImageDestination? - PullRequest
1 голос
/ 23 мая 2011

Я работаю над приложением, которое должно сделать снимок с помощью UIImagePickerController, отобразить его миниатюру в приложении, а также отправить это изображение на сервер с помощью ASIFormDataRequest (из ASIHTTPRequest).

Я хочу использовать setFile:withFileName:andContentType:forKey: из ASIFormDataRequest, поскольку, по моему опыту, это быстрее, чем пытаться отправить изображение с использованием UIImageJPEGRepresentation и отправлять необработанные NSData.Для этого я использую CGImageDestination и создаю место назначения изображения с URL-адресом, сохраняю это изображение на диск, а затем загружаю этот файл на диск.

Для созданияthumbnail Я использую CGImageSourceCreateThumbnailAtIndex (см. документы ) и создаю источник изображения с путем к файлу, который я только что сохранил.

Моя проблема в том, что независимо от того, какие параметры я передаюназначение изображения или вызов создания эскиза, мой эскиз всегда получается повернутым на 90 градусов против часовой стрелки.Загруженное изображение также поворачивается.Я попытался явно установить ориентацию в опциях изображения, используя CGImageDestinationSetProperties, но, похоже, это не так.Единственное решение, которое я нашел, - это повернуть изображение в памяти, но я действительно хочу избежать этого, поскольку это удваивает время, необходимое для завершения операции миниатюры + сохранения.В идеале я хотел бы иметь возможность вращать изображение на диске.

Я что-то упустил в том, как я использую CGImageDestination или CGImageSource?Я выложу код ниже.

Сохранение изображения:

NSURL *filePath = [NSURL fileURLWithPath:self.imagePath];
CGImageRef imageRef = [self.image CGImage];
CGImageDestinationRef ref = CGImageDestinationCreateWithURL((CFURLRef)filePath, kUTTypeJPEG, 1, NULL);
CGImageDestinationAddImage(ref, imageRef, NULL);

NSDictionary *props = [[NSDictionary dictionaryWithObjectsAndKeys:
                        [NSNumber numberWithFloat:1.0], kCGImageDestinationLossyCompressionQuality,
                        nil] retain];
//Note that setting kCGImagePropertyOrientation didn't work here for me

CGImageDestinationSetProperties(ref, (CFDictionaryRef) props);

CGImageDestinationFinalize(ref);
CFRelease(ref);

Генерация миниатюры

CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)filePath, NULL);
if (!imageSource)
    return;

CFDictionaryRef options = (CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys:
                                            (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailWithTransform,
                                            (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailFromImageIfAbsent,
                                            (id)[NSNumber numberWithFloat:THUMBNAIL_SIDE_LENGTH], (id)kCGImageSourceThumbnailMaxPixelSize, nil];
CGImageRef imgRef = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options);
UIImage *thumb = [UIImage imageWithCGImage:imgRef];

CGImageRelease(imgRef);
CFRelease(imageSource);

А затем для загрузки изображения я просто использую

[request setFile:path withFileName:fileName andContentType:contentType forKey:@"photo"];

, где path - путь к файлу, сохраненному с кодом выше.

1 Ответ

0 голосов
/ 28 сентября 2011

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

...