Создание UIImage из другого UIImage с использованием imageWithData возвращает nil - PullRequest
5 голосов
/ 30 июля 2010

Я пытаюсь извлечь данные изображения из одного изображения, изменить его и создать из него новое изображение.Для начала я попытался просто скопировать данные без каких-либо изменений, чтобы разобраться в основах, но это не удалось (UIImage +imageWithData: возвращает ноль).Кто-нибудь может понять, почему это не сработает?

// I've confirmed that the follow line works

UIImage *image = [UIImage imageNamed:@"image_foo.png"];

// Get a reference to the data, appears to work

CFDataRef dataRef = CGDataProviderCopyData(CGImageGetDataProvider([image CGImage]));

// Get the length of memory to allocate, seems to work (e.g. 190000)

int length = CFDataGetLength(dataRef) * sizeof(UInt8);

UInt8 * buff = malloc(length);

// Again, appears to work 

CFDataGetBytes(dataRef, CFRangeMake(0,length),buff);

// Again, appears to work

NSData * newData = [NSData dataWithBytesNoCopy:buff length:length];

// This fails by returning nil

UIImage *image2 = [UIImage imageWithData:newData]; 

Примечание:

Я также попытался использовать:

UInt8 * data = CFDataGetBytePtr (dataRef);

и просто передать это прямо в NSData,

Тот же результат.

1 Ответ

1 голос
/ 25 сентября 2010

Я считаю, что imageWithData принимает image-file-data , а не image-display-data, то есть то, что вы передаете.Попробуйте что-то вроде этого:

NSData * newData = UIImageJPEGRepresentation(image, 1.0);
UIImage *image2 = [UIImage imageWithData:newData]; 

UIImageJPegRepresentation() возвращает данные, которые вы записали бы в файл для создания файла .jpg на диске.Я уверен на 99,44%, чего хочет imageWithData:.

ПРИМЕЧАНИЕ: если вы хотите манипулировать данными перед созданием image2, то вам do нужны данные дисплея,в этом случае способ получить изображение обратно немного сложнее, но выглядит примерно так:

    // Create a color space
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    if (colorSpace == NULL)
    {
        fprintf(stderr, "Error allocating color space\n");
        return nil;
    }

    CGContextRef context = CGBitmapContextCreate (bits, size.width, size.height,
            8, size.width * 4, colorSpace,
            kCGImageAlphaPremultipliedLast | IMAGE_BYTE_ORDER
            );
    CGColorSpaceRelease(colorSpace );

    if (context == NULL)
    {
        fprintf (stderr, "Error: Context not created!");
        return nil;
    }

    CGImageRef ref = CGBitmapContextCreateImage(context);
    //free(CGBitmapContextGetData(context));                                      //* this appears to free bits -- probably not mine to free!
    CGContextRelease(context);

    UIImage *img = [UIImage imageWithCGImage:ref];
    CFRelease(ref);                                                             //* ?!?! Bug in 3.0 simulator.  Run in 3.1 or higher.

    return img;

(Приведенный выше код получен из примеров Эрики Садун. Умные части ее; все ошибки мои. Но это общая идея, и она должна работать.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...