Вы можете создать CGDataProvider
и позволить CG запрашивать необходимые данные у вашего провайдера вместо записи в буфер изображения.
Вот очень простой пример, который генерирует черный CGImage
размером 64x64.
CGDataProviderSequentialCallbacks callbacks;
callbacks.getBytes = getBytes;
CGDataProviderRef provider = CGDataProviderCreateSequential(NULL, &callbacks);
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
CGImageRef img = CGImageCreate(64, // width
64, // height
8, // bitsPerComponent
24, // bitsPerPixel
64*3, // bytesPerRow
space, // colorspace
kCGBitmapByteOrderDefault, // bitmapInfo
provider, // CGDataProvider
NULL, // decode array
NO, // shouldInterpolate
kCGRenderingIntentDefault); // intent
CGColorSpaceRelease(space);
CGDataProviderRelease(provider);
// use the created CGImage
CGImageRelease(img);
и getBytes определяется следующим образом:
size_t getBytes(void *info, void *buffer, size_t count) {
memset(buffer, 0x00, count);
return count;
}
конечно, вы захотите реализовать другие обратные вызовы (skipForward
, rewind
, releaseInfo
) и использовать подходящую структуру или объект для info
.
Для получения дополнительной информации посмотрите ссылки CGImage и CGDataProvider .