Загружая CGImage или NSImage из файла с помощью стандартного формата изображения (jpeg, gif, png и.) все очень просто.
Однако я теперь должен создать CGImage из массива в байтах в памяти, сгенерированной с помощью libfreetype. Его действительно легкое для создания структур OpenGL из массива отформатированных байтов, и я вижу, как создать CGBitmapContext для записи в. Но я, может казаться, не нахожу простой способ создать CGImage из массива необработанного пикселя.
Вы можете создать 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 .