2009-09-13 9 views
6

Poniżej znajduje się kod skopiowany (z tej strony) i zmodyfikowany tylko nieznacznie, ponieważ oryginalny kod nie zostałby skompilowany. Chcę manipulować tablicą bajtów w celu wykrycia krawędzi i ewentualnie prostych zmian kolorów, ale najpierw chciałem uzyskać podstawowy kod działający. Obecnie system kompiluje i uruchamia. Wyświetla źle rysowane słonia na ekranie. Kiedy dotknę obrazu, znika. Krok po kroku pokazuje wynik imageWithData jako 0x0. Próbowałem tego zarówno z png i bmp i tym samym wynikiemUtwórz UiImage z NSData

Wszelkie wskazówki, co robię źle!

ImageViewDrawable jest zdefiniowany jako:

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

Odpowiedz

4

imageWithData: nie wziąć jakieś dowolne dane i zinterpretować go jako RGBA nieskompresowanego tekstury. Wymaga danych zawierających bajty rozpoznanego formatu obrazu (takich jak JPG, PNG lub TIFF), analizuje je i odpowiednio kompresuje obrazy.

Aby zrobić to, co chcesz, musisz utworzyć CGContext, który jest odpowiednio skonfigurowany (bajty wiersza, format pikseli, itp.), Albo przy użyciu pamięci już przydzielonej jako jej przechowywania kopii zapasowej, lub prosząc go o jej przechowywanie, a następnie kopiowanie do niego bajtów. Po wykonaniu tej czynności można użyć wszystkich funkcji związanych z CGContext, w tym możliwości tworzenia obiektu UII z tego kontekstu.

+1

Czy to nie ma znaczenia, że ​​dane, które karmię w istocie pochodzą z istniejącego UIImage? –

+0

Widzę mój problem. Ten zagnieżdżony zestaw wywołań - CGDataProviderCopyData (CGImageGetDataProvider()) - pobiera dostawcę danych, a następnie JUST kopiuje dane. Co oznacza, że ​​właśnie odbieram piksele, a nie resztę konfiguracji z oryginalnego obrazu. Muszę więc odtworzyć obraz, używając tych pikseli i informacji CG, o których wspomniałeś. Jeszcze raz dziękuję za pomoc –