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 带有(选择器)窗口旋转

为啥使用标准 BMP 位数据的 iphone CGImageCreate 会给出错误的结果?

在主线程外创建 UIImage

Docker限制容器的Block IO

iOS 视频截取

使用 -Wall 编译 c++ - 来自其他文件的警告