У меня есть функция ниже для создания и возврата UIImage из CGImage.imageBytes - это тип массива UInt8, содержащий 0 или 255, потому что в этом случае я хочу отобразить случайные точки серой шкалы.
- (UIImage *)imageWithBitmapBytes:(Byte *)imageBytes width:(size_t)width height:(size_t)height componentCount:(NSUInteger)componentCount {
// bitmap size
NSUInteger imageBufferSize = width * height * componentCount;
// CGDataProvider create
CGDataProviderRef dataProviderRef = CGDataProviderCreateWithData(nil, imageBytes, imageBufferSize, bufferFree);
// 8bit
NSUInteger bitsPerComponent = 8;
// 24 if RGB 32 if RGBA
NSUInteger bitsPerPixel = bitsPerComponent * componentCount;
// bytes per row
NSUInteger bytesPerRow = width * bitsPerPixel / 8;
// CGImage
CGImageRef cgImage = CGImageRetain(CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, CGColorSpaceCreateDeviceGray(), (CGBitmapInfo)kCGImageAlphaNone, dataProviderRef, nil, false, kCGRenderingIntentDefault));
CGDataProviderRelease(dataProviderRef);
UIImage *image =[UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
return image;
}
И я создаю две растровые данные (для внешнего изображения и внутреннего изображения) с помощью этой функции
- (void)setupBitmapArrays {
bitmapImages = [NSMutableArray array];
insideBitmapImages = [NSMutableArray array];
for (int i = 0; i < FRAME; i++) {
imageBytesArray[i] = calloc(imageViewWidth * imageViewHeight * componentCount, sizeof(UInt8));
for (int j = 0; j < imageViewWidth * imageViewHeight; j++) {
imageBytesArray[i][j] = random();
}
}
for (int i = 0; i < FRAME; i++) {
insideImageBytesArray[i] = calloc(insideImageViewWidth * insideImageViewHeight * componentCount, sizeof(UInt8));
for (int j = 0; j < insideImageViewWidth * insideImageViewHeight; j++) {
insideImageBytesArray[i][j] = random();
}
}
}
Изображение выше содержит внешнее и внутреннее изображения (каждое слева и справа).
Внешнее и внутреннее изображениеперекрывается, но я установил белый цвет фона внутреннего изображения, чтобы не перекрывать сами точки. Но, как вы можете видеть, интенсивность точек различна, даже если отношение параметра bytesperrow к размеру изображения одинаково.Как это может произойти?