Создать UiImage из NSData - PullRequest
       24

Создать UiImage из NSData

6 голосов
/ 13 сентября 2009

Ниже приведен код, который я скопировал (с этого сайта) и немного изменил, поскольку исходный код не будет компилироваться. Я хочу манипулировать байтовым массивом для обнаружения краев и, в конечном итоге, для простых изменений цветов, но сначала я хотел, чтобы базовый код работал. В настоящее время система компилируется и запускается. На экране отображается плохо нарисованный слон. Когда я касаюсь изображения, оно исчезает. Пошаговое отображение показывает результат imageWithData как 0x0. Я пробовал это с PNG и BMP и тот же результат

Есть какие-нибудь подсказки, что я делаю неправильно?!

ImageViewDrawable определяется как:

@interface ImageViewDrawable : UIImageView

// I am using the following code to initialize this ImageView
ImageViewDrawable * uiv = [[ImageViewDrawable alloc] initWithImage:[UIImage imageNamed:@"ele.png"] ];

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    // get and work on pixel data
    NSData* pixelData = (NSData*) CGDataProviderCopyData(CGImageGetDataProvider(self.image.CGImage));
    char* bytes =[pixelData bytes];

    // Take away the red pixel, assuming 32-bit RGBA
    for(int i = 0; i < [pixelData length]; i += 4) {
        bytes[i] = bytes[i]; // red
        bytes[i+1] = bytes[i+1]; // green
        bytes[i+2] = bytes[i+2]; // blue
        bytes[i+3] = bytes[i+3]; // alpha
    }

    // convert pixel back to uiiimage
    NSData* newPixelData = [NSData dataWithBytes:bytes length:[pixelData length]];
    char * bytes2 =[pixelData bytes];   
    UIImage * newImage = [UIImage imageWithData:newPixelData] ; 
    [self setImage: newImage ]; 
}

1 Ответ

4 голосов
/ 13 сентября 2009

imageWithData: не принимает произвольные данные и не интерпретирует их как несжатую текстуру RGBA. Он принимает данные, которые содержат байты распознанного формата изображения (например, JPG, PNG или TIFF), анализирует и соответствующим образом распаковывает изображения.

Для того, чтобы сделать то, что вы хотите, вам нужно создать CGContext, который соответствующим образом сконфигурирован (байты строк, формат пикселей и т. Д.), Либо используя память, которую вы уже выделили в качестве резервного хранилища, либо запросив его для хранения. а затем скопировать ваши байты в него. После этого вы можете использовать все функции, связанные с CGContext, включая возможность создания UIImage из этого контекста.

...