2009-09-13 32 views
6

Dưới đây là mã tôi đã sao chép (từ trang này) và được sửa đổi chỉ một chút vì mã gốc sẽ không biên dịch. Tôi muốn thao tác mảng byte để phát hiện cạnh và cuối cùng là những thay đổi đơn giản đối với màu sắc, nhưng trước tiên tôi muốn lấy mã cơ bản hoạt động. Hiện tại, hệ thống đã biên dịch và chạy. Nó hiển thị một con voi được vẽ kém trên màn hình. Khi tôi chạm vào hình ảnh, nó biến mất. Bước qua cho thấy kết quả của imageWithData là 0x0. Tôi đã thử điều này với cả png và bmp và cùng một kết quảTạo UiImage từ NSData

Bất kỳ manh mối nào cho những gì tôi đang làm sai?

ImageViewDrawable được định nghĩa là:

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

Trả lời

4

imageWithData: không mất một số dữ liệu tùy ý và giải thích nó như là một kết cấu không nén RGBA. Dữ liệu có chứa các byte có định dạng hình ảnh được công nhận (như JPG, PNG hoặc TIFF), phân tích cú pháp và giải nén hình ảnh một cách thích hợp.

Để làm những gì bạn muốn, bạn cần tạo một CGContext được định cấu hình thích hợp (byte hàng, định dạng pixel, vv), hoặc sử dụng bộ nhớ mà bạn đã phân bổ làm bộ đệm sao lưu hoặc bằng cách yêu cầu nó lưu trữ và sau đó sao chép các byte của bạn vào đó. Một khi bạn làm điều đó bạn có thể sử dụng tất cả các chức năng liên quan đến CGContext, bao gồm khả năng tạo ra một UIImage từ bối cảnh đó.

+1

Vì vậy, không quan trọng là dữ liệu tôi cung cấp về cơ bản đến từ một UIImage hiện có? –

+0

Tôi thấy vấn đề của mình. Tập hợp các cuộc gọi lồng nhau này - CGDataProviderCopyData (CGImageGetDataProvider()) - nhận được nhà cung cấp dữ liệu, và sau đó JUST sao chép dữ liệu. Điều đó có nghĩa là tôi chỉ nhận được pixel và không phải phần còn lại của cấu hình từ hình ảnh gốc. Vì vậy, tôi phải tạo lại một hình ảnh bằng cách sử dụng các pixel đó và thông tin CG mà bạn đã đề cập đến. Cảm ơn một lần nữa để được giúp đỡ –

Các vấn đề liên quan