Я работаю над приложением, которое должно сделать снимок с помощью 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
- путь к файлу, сохраненному с кодом выше.