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ự.
tại sao dataWithBytesNoCopy? – jsicary
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