cgimagecreate 正确设置 bytesperrow 但点的强度随着图像大小的变化而不同
Posted
技术标签:
【中文标题】cgimagecreate 正确设置 bytesperrow 但点的强度随着图像大小的变化而不同【英文标题】:cgimagecreate set bytesperrow correctly but intensity of dots different as the image size changed 【发布时间】:2018-12-17 06:49:43 【问题描述】:我有下面的函数来从 CGImage 创建和返回 UIImage。 imageBytes 是包含 0 或 255 的 UInt8 数组类型,因为在这种情况下我想显示灰度随机点。
- (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 参数与图像大小的比率也是如此是相同的。怎么会这样?
【问题讨论】:
内部和外部图像的亮度/强度似乎相同。我认识到的主要区别是外部图像要么适合屏幕分辨率,要么图像像素大于屏幕分辨率。因此,您可以获得从白色到黑色的全范围亮度。然而,在内部图像中,图像像素很可能小于屏幕分辨率。因此,每个屏幕像素是多个图像像素的平均值。平均导致浅灰色和深灰色之间的亮度范围更小。 谢谢@Codo,你知道如何解决这个问题吗? 【参考方案1】:所有问题都来自我分配给内部图像的位图数据。我将外部图像的位图数据分配给内部图像。
【讨论】:
以上是关于cgimagecreate 正确设置 bytesperrow 但点的强度随着图像大小的变化而不同的主要内容,如果未能解决你的问题,请参考以下文章
错误 CGImageCreate:无效的图像大小:0 x 0 带有(选择器)窗口旋转