2010-07-29 34 views
5

Tôi đang cố truy xuất dữ liệu hình ảnh từ một hình ảnh, sửa đổi nó và tạo một ảnh mới từ nó. Để bắt đầu, tôi đã thử chỉ sao chép dữ liệu mà không cần sửa đổi để có được những điều cơ bản xuống - nhưng điều đó không thành công (UIImage +imageWithData: trả về nil). Bất cứ ai có thể thấy lý do tại sao điều này sẽ không hoạt động?Tạo UIImage từ một UIImage khác bằng cách sử dụng imageWithData trả về nil

// I've confirmed that the follow line works 

UIImage *image = [UIImage imageNamed:@"image_foo.png"]; 

// Get a reference to the data, appears to work 

CFDataRef dataRef = CGDataProviderCopyData(CGImageGetDataProvider([image CGImage])); 

// Get the length of memory to allocate, seems to work (e.g. 190000) 

int length = CFDataGetLength(dataRef) * sizeof(UInt8); 

UInt8 * buff = malloc(length); 

// Again, appears to work 

CFDataGetBytes(dataRef, CFRangeMake(0,length),buff); 

// Again, appears to work 

NSData * newData = [NSData dataWithBytesNoCopy:buff length:length]; 

// This fails by returning nil 

UIImage *image2 = [UIImage imageWithData:newData]; 

Lưu ý:

Tôi cũng đã cố gắng sử dụng:

uint8 * data = CFDataGetBytePtr (dataRef);

và chỉ đường ống thẳng vào NSData.

Kết quả tương tự.

+1

tại sao dataWithBytesNoCopy? – jsicary

+0

dataWithBytesNoCopy được sử dụng bởi vì anh ta đã cấp phát bộ đệm bằng cách sử dụng malloc. Bằng cách này, anh ta sẽ có quyền truy cập vào bộ đệm ảnh thực tế của image2 trong suốt thời gian tồn tại của đối tượng đó. – Till

Trả lời

1

Tôi tin rằng imageWithData mất image-file-data, không phải hình ảnh-hiển thị-dữ liệu, đó là những gì bạn đang truyền. Hãy thử một cái gì đó như thế này:

NSData * newData = UIImageJPEGRepresentation(image, 1.0); 
UIImage *image2 = [UIImage imageWithData:newData]; 

trả về dữ liệu bạn sẽ ghi vào tệp để tạo tệp .jpg trên đĩa. Điều đó, tôi là 99,44% chắc chắn là những gì imageWithData: muốn.

LƯU Ý: nếu bạn muốn thao tác dữ liệu trước khi tạo image2, thì bạn làm muốn dữ liệu hiển thị, trong trường hợp này, cách bạn lấy lại hình ảnh phức tạp hơn một chút như thế này:

// Create a color space 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    if (colorSpace == NULL) 
    { 
     fprintf(stderr, "Error allocating color space\n"); 
     return nil; 
    } 

    CGContextRef context = CGBitmapContextCreate (bits, size.width, size.height, 
      8, size.width * 4, colorSpace, 
      kCGImageAlphaPremultipliedLast | IMAGE_BYTE_ORDER 
      ); 
    CGColorSpaceRelease(colorSpace); 

    if (context == NULL) 
    { 
     fprintf (stderr, "Error: Context not created!"); 
     return nil; 
    } 

    CGImageRef ref = CGBitmapContextCreateImage(context); 
    //free(CGBitmapContextGetData(context));          //* this appears to free bits -- probably not mine to free! 
    CGContextRelease(context); 

    UIImage *img = [UIImage imageWithCGImage:ref]; 
    CFRelease(ref);                //* ?!?! Bug in 3.0 simulator. Run in 3.1 or higher. 

    return img; 

(... Đoạn mã trên có nguồn gốc từ các ví dụ bởi Erica Sadun các bộ phận thông minh là cô; những sai lầm là tất cả của tôi Nhưng đây là ý tưởng chung, và nó cũng làm việc)

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