iOS сжимает изображение из nsdata - PullRequest
0 голосов
/ 14 сентября 2011

У меня есть приложение, которое загружает изображения JPEG, но они большие, больше, чем необходимо для приложения. Я создал класс, который будет загружать NSData изображения. Какой лучший способ взять NSData и сжать изображение.

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

Есть ли альтернативный способ, при котором вам не нужно записывать на диск и сжимать его напрямую, а данные принимаются?

Ответы [ 2 ]

3 голосов
/ 14 сентября 2011

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

Для преобразования изображения в другой формат вы можете использовать функции, определенные в CGImageDestination.h

Я бы сделал функцию метода класса, которая преобразует данное изображение:

+ (NSData*)imageDataWithCGImage:(CGImageRef)CGimage UTType:(const CFStringRef)imageUTType desiredCompressionQuality:(CGFloat)desiredCompressionQuality
{
    NSData* result = nil;

    CFMutableDataRef destinationData = CFDataCreateMutable(kCFAllocatorDefault, 0);
    CGImageDestinationRef destinationRef = CGImageDestinationCreateWithData(destinationData, imageUTType, 1, NULL);
    CGImageDestinationSetProperties(destinationRef, (CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithFloat:desiredCompressionQuality], (NSString*)kCGImageDestinationLossyCompressionQuality, nil]);
    if (destinationRef != NULL)
    {
        CGImageDestinationAddImage(destinationRef, CGimage, NULL);

        if (CGImageDestinationFinalize(destinationRef))
        {
            result = [NSData dataWithData:(NSData*)destinationData];
        }
    }
    if (destinationData)
    {
        CFRelease(destinationData);
    }
    if (destinationRef)
    {
        CFRelease(destinationRef);
    }
    return result;
}

Тип изображения может быть kUTTypePNG, но параметр качества, скорее всего, не будет работать. Это также может быть kUTTypeJPEG2000 для ваших нужд.

Вы можете инициализировать новое изображение с данными или сохранить его на диск.

1 голос
/ 14 сентября 2011

Если вы спрашиваете, о чем я думаю, вы можете создавать объекты UIImage с помощью фрагмента NSData, используя +imageWithData:.

NSData *imageData = // Get the image data here
UIImage *image = [UIImage imageWithData:data];
...