2009-09-13 9 views
6

Ci-dessous est le code que j'ai copié (à partir de ce site) et modifié seulement légèrement puisque le code d'origine ne compilerait pas. Je veux manipuler le tableau d'octets pour la détection des contours et éventuellement de simples changements de couleurs, mais je voulais d'abord que le code de base fonctionne. Actuellement, le système compile et s'exécute. Il affiche un éléphant mal dessiné à l'écran. Quand je touche l'image, elle disparaît. Le passage montre le résultat de imageWithData comme 0x0. J'ai essayé ceci avec un png et un bmp et le même résultatCréer UiImage à partir de NSData

Des indices à ce que je fais mal?!

ImageViewDrawable est défini comme:

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

Répondre

4

imageWithData: ne prend pas des données arbitraires et l'interpréter comme une texture non compressé RGBA. Il prend une donnée qui contient des octets d'un format d'image reconnu (comme JPG, PNG, ou TIFF), analyse les données et décompresse les images de manière appropriée. Pour faire ce que vous voulez, vous devez créer un CGContext configuré de façon appropriée (octets de ligne, format de pixel, etc.), soit en utilisant la mémoire que vous avez déjà allouée comme stockage de sauvegarde, soit en lui demandant son stockage, puis en copiant vos octets dans celui-ci. Une fois que vous faites cela, vous pouvez utiliser toutes les fonctionnalités liées à CGContext, y compris la possibilité de créer un UIImage à partir de ce contexte.

+1

Donc, peu importe que les données que je nourris proviennent essentiellement d'un UIImage existant? –

+0

Je vois mon problème. Cet ensemble imbriqué d'appels - CGDataProviderCopyData (CGImageGetDataProvider()) - obtient le fournisseur de données, puis copie juste les données. Ce qui signifie que je reçois juste les pixels et non le reste de la configuration de l'image originale. Je dois donc recréer une image en utilisant ces pixels et les informations CG que vous avez mentionnées. Merci encore pour votre aide –

Questions connexes