2009-09-13 3 views
6

Di seguito è riportato il codice che ho copiato (da questo sito) e modificato solo leggermente poiché il codice originale non verrebbe compilato. Voglio manipolare l'array di byte per il rilevamento dei bordi e, infine, semplici modifiche ai colori, ma prima volevo che il codice di base funzionasse. Attualmente, il sistema compila ed esegue. Mostra un elefante mal disegnato sullo schermo. Quando tocco l'immagine, scompare. Passando attraverso mostra il risultato di imageWithData come 0x0. Ho provato questo con un png e un bmp e lo stesso risultatoCrea UiImage da NSData

Eventuali indizi su cosa sto facendo male ?!

ImageViewDrawable è definito come:

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

risposta

4

imageWithData: non prendere alcuni dati arbitrari e interpretarlo come una texture non compresso RGBA. Prende un dato che contiene byte di un formato di immagine riconosciuto (come JPG, PNG o TIFF), analizza i dati e decomprime le immagini in modo appropriato.

Per fare ciò che vuoi, devi creare un CGContext che sia configurato correttamente (riga byte, formato pixel, ecc.), Sia usando la memoria che hai già assegnato come supporto, sia chiedendo il suo archiviazione e quindi copiare i byte in esso. Una volta fatto, puoi utilizzare tutte le funzionalità correlate a CGContext, inclusa la possibilità di creare un UIImage da quel contesto.

+1

Quindi non importa che i dati che sto somministrando provengano essenzialmente da un UIImage esistente? –

+0

Vedo il mio problema. Questo gruppo nidificato di chiamate - CGDataProviderCopyData (CGImageGetDataProvider()) - ottiene il fornitore di dati, quindi JUST copia i dati. Il che significa che sto ottenendo solo i pixel e non il resto della configurazione dall'immagine originale. Quindi devo ricreare un'immagine usando quei pixel e le informazioni CG a cui hai fatto riferimento. Grazie ancora per l'aiuto –