2009-09-13 15 views
6

Unten ist Code ich kopiert (von dieser Website) und nur geringfügig modifiziert, da der ursprüngliche Code nicht kompilieren würde. Ich möchte das Byte-Array für Kantenerkennung und schließlich einfache Änderungen an Farben manipulieren, aber zuerst wollte ich den grundlegenden Code arbeiten lassen. Momentan wird das System kompiliert und ausgeführt. Es zeigt einen schlecht gezeichneten Elefanten auf dem Bildschirm. Wenn ich das Bild berühre, verschwindet es. Durchgehen zeigt das Ergebnis von imageWithData als 0x0. Ich habe dies sowohl mit einem Png und einem BMP versucht und das gleiche ErgebnisErstellen Sie UiImage von NSData

Irgendwelche Hinweise auf was ich falsch mache?

ImageViewDrawable ist definiert als:

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

Antwort

4

imageWithData: Nehmen Sie nicht ein paar beliebige Daten und als RGBA unkomprimierte Textur interpretieren. Es benötigt Daten, die Bytes eines erkannten Bildformats enthalten (wie JPG, PNG oder TIFF), analysiert diese und dekomprimiert die Bilder entsprechend.

Um zu tun, was Sie wollen, müssen Sie einen CGContext erstellen, der entsprechend konfiguriert ist (Zeilenbytes, Pixelformat, usw.), entweder mit dem Speicher, den Sie bereits als Sicherungsspeicher zugewiesen haben, oder indem Sie ihn anfordern Speichern und dann kopieren Sie Ihre Bytes hinein. Sobald Sie das getan haben, können Sie alle CGContext-Funktionen verwenden, einschließlich der Möglichkeit, ein UIImage aus diesem Kontext zu erstellen.

+1

Es spielt also keine Rolle, dass die Daten, die ich einspeise, im Wesentlichen von einem vorhandenen UIImage stammen? –

+0

Ich sehe mein Problem. Diese verschachtelte Gruppe von Aufrufen - CGDataProviderCopyData (CGImageGetDataProvider()) - ruft den Datenprovider ab und kopiert dann JUST die Daten. Das bedeutet, dass ich nur die Pixel und nicht den Rest der Konfiguration aus dem Originalbild erhalte. Also muss ich ein Bild mit diesen Pixeln und den CG-Informationen, auf die Sie sich bezogen haben, neu erstellen. Danke nochmal für Hilfe –