2009-09-13 4 views
6

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

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

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 ]; 
} 

ответ

4

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

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

+1

Не имеет значения, что данные, которые я кормлю, по существу, были получены из существующего UIImage? – 2009-09-13 03:32:06

+0

Я вижу свою проблему. Этот вложенный набор вызовов - CGDataProviderCopyData (CGImageGetDataProvider()) - получает поставщика данных, а затем просто копирует данные. Это означает, что я просто получаю пиксели, а не остальную часть конфигурации от исходного изображения. Поэтому мне нужно воссоздать образ, используя эти пиксели и информацию о CG, о которой вы говорили. Еще раз спасибо за помощь – 2009-09-13 05:05:02

 Смежные вопросы

  • Нет связанных вопросов^_^