Вы можете использовать UIImageJPEGRepresentation () в фоновом режиме (я использую его таким образом в текущем проекте).
Однако вы не можете создать UIImage так, как вы делаете вКроме того, вызов [UIImage imagewithCGImage]
должен выполняться в основном потоке (как правило, все вызовы UIKit должны выполняться в основном потоке).
Это похоже на случай, когда вам могут понадобиться вложенные блоки.
Редактировать: Мой собственный код вызывает [UIImage imagewithCGImage]
в фоновом потоке, но я все еще подозреваю, что в некоторых случаях это может вызвать проблемы.Но мой код работает.
Edit2: Я только что заметил, что вы изменяете размер изображения, UIImage + Resize.В этом посте есть ссылка на очень хороший класс, который был создан для того, чтобы сделать это надежным способом:
http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/
Вы действительно должны прочитать всю эту страницу, чтобы понять нюансыизменение размера изображений.Как я уже сказал, я использую это из фонового потока, хотя часть того, что он делает внутри, - это то, что вы делали.
Edit3: Если вы работаете на iOS4 или более поздней версии, вы можете захотеть использоватькаркас ImageIO для вывода изображений, который с большей вероятностью является поточно-ориентированным:
http://developer.apple.com/graphicsimaging/workingwithimageio.html
Пример кода, который трудно найти, вот метод, который сохраняет изображение PNG с использованием ImageIO(на основе кода в разделе «Программирование с кварцем: 2D и PDF графика в Mac OS X):
// You'll need both ImageIO and MobileCoreServices frameworks to have this compile
#import <ImageIO/ImageIO.h>
#import <MobileCoreServices/MobileCoreServices.h>
void exportCGImageToPNGFileWithDestination( CGImageRef image, CFURLRef url)
{
float resolution = 144;
CFTypeRef keys[2];
CFTypeRef values[2];
CFDictionaryRef options = NULL;
// Create image destination to go into URL, using PNG
CGImageDestinationRef imageDestination = CGImageDestinationCreateWithURL( url, kUTTypePNG, 1, NULL);
if ( imageDestination == NULL )
{
fprintf( stderr, "Error creating image destination\n");
return;
}
// Set the keys to be the X and Y resolution of the image
keys[0] = kCGImagePropertyDPIWidth;
keys[1] = kCGImagePropertyDPIHeight;
// Create a number for the DPI value for the image
values[0] = CFNumberCreate( NULL, kCFNumberFloatType, &resolution );
values[1] = values[0];
// Options dictionary for output
options = CFDictionaryCreate(NULL,
(const void **)keys,
(const void **)values,
2,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
CFRelease(values[0]);
// Adding the image to the destination
CGImageDestinationAddImage( imageDestination, image, options );
CFRelease( options );
// Finalizing writes out the image to the destination
CGImageDestinationFinalize( imageDestination );
CFRelease( imageDestination );
}