Если это просто шкала серого, то должно работать следующее (закодировано как I, вероятно, стоит проверить на ошибки):
CGDataProviderRef dataProvider =
CGDataProviderCreateWithData(NULL, pointerToYourData, width*height, NULL);
CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceGray();
CGImageRef inputImage = CGImageCreate( width, height,
8, 8, width,
colourSpace,
kCGBitmapByteOrderDefault,
dataProvider,
NULL, NO,
kCGRenderingIntentDefault);
CGDataProviderRelease(dataProvider);
CGColorSpaceRelease(colourSpace);
UIImage *image = [UIImage imageWithCGImage:inputImage];
CGImageRelease(inputImage);
someImageView.image = image;
Это было бы для однократного отображения, предполагая, что вы не хотите писать собственный подкласс UIView (который стоит усилий, только если производительность, вероятно, является проблемой).
Насколько я понимаю из документов, провайдер данных может быть создан только один раз за время существования вашего буфера C. Я не думаю, что это верно для изображения, но если вы создали CGBitmapContext, чтобы обернуть ваш буфер, а не провайдера и изображение, это бы сохранялось, и вы могли бы использовать CGBitmapContextCreateImage
, чтобы заставить CGImageRef двигаться дальше. Вероятно, стоит проверить в обоих направлениях, если это проблема.
РЕДАКТИРОВАТЬ: так что альтернативный путь будет:
// get a context from your C buffer; this is now something
// CoreGraphics could draw to...
CGColorSpaceRef colourSpace = CGColorSpaceCreateDeviceGray();
CGContextRef context =
CGBitmapContextCreate(pointerToYourData,
width, height,
8, width,
colourSpace,
kCGBitmapByteOrderDefault);
CGColorSpaceRelease(colourSpace);
// get an image of the context, which is something
// CoreGraphics can draw from...
CGImageRef image = CGBitmapContextCreateImage(context);
/* wrap in a UIImage, push to a UIImageView, as before, remember
to clean up 'image' */
CoreGraphics копирует вещи очень лениво, поэтому ни одно из этих решений не должно быть таким дорогостоящим, как подразумевают многочисленные этапы.