2009-09-13 17 views
6

Aşağıda kodu (bu sitedeki) kopyaladım ve orijinal kod derlenmeyeceği için biraz değiştirdim. Kenar tespiti ve sonuçta renklerdeki basit değişiklikler için bayt dizisini değiştirmek istiyorum, ancak önce temel kodun çalışmasını istedim. Şu anda sistem derleniyor ve çalışıyor. Ekranda kötü çizilmiş bir fil görüntüler. Görüntüye dokunduğumda, kaybolur. Stepping, imageWithData sonucunu 0x0 olarak gösterir. Bunu hem png hem de bmp ile denedim ve aynı sonuçNSData'dan UiImage oluştur

Neyi yanlış yaptığımla ilgili ipuçları var mı?

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

cevap

4

imageWithData:

ImageViewDrawable olarak tanımlanır bazı keyfi verileri alıp bir RGBA sıkıştırılmamış doku olarak yorumlar etmez. Tanınan bir görüntü formatının (JPG, PNG veya TIFF gibi) baytlarını içeren, özleri ayrıştıran ve görüntüleri uygun şekilde açabilen bir veriyi alır.

İstediğiniz şeyi yapmak için, uygun bir şekilde yapılandırılmış (satır bayt, piksel biçimi, vb.) Bir CGContext oluşturmalısınız. Bu, ya bellek desteğiniz olarak tahsis ettiğiniz belleği kullanarak ya da depolama ve daha sonra baytlarınızı kopyalayın. Bunu yaptıktan sonra, bu bağlamdan bir UIImage oluşturma yeteneği dahil olmak üzere, CGContext ile ilgili tüm işlevlerini kullanabilirsiniz.

+1

Yani beslediğim veriler esasen mevcut bir UIImage'dan geldi mi? –

+0

Sorunumu görüyorum. Bu iç içe geçmiş çağrı kümeleri - CGDataProviderCopyData (CGImageGetDataProvider()) - veri sağlayıcısını alır ve ardından JUST verileri kopyalar. Yani, sadece pikselleri alıyorum ve yapılandırmanın geri kalanını orijinal görüntüden almıyorum. Bu yüzden, söz konusu pikselleri ve yönlendirdiğiniz CG bilgilerini kullanarak bir görüntü oluşturmam gerekiyor. Yardım için tekrar teşekkürler –