CGImageRef 宽度与每行字节数不一致

问题描述 投票:0回答:1

我正在尝试从屏幕缓冲区中读取像素,我正在使用

CGImageRef
创建一个
CGDisplayCreateImage
,但是
CGImageGetWidth
CGImageGetBytesPerRow
的值在一起没有意义,将每行的字节分开按每像素字节数计算,每行有 1376 个像素,但图像的宽度为 1366。

这是怎么回事?图像中是否有某种填充?如何安全地读取我从中获取的数据并获得正确的结果?

编辑:重现此问题所需的最少代码如下:

#import <Foundation/Foundation.h>
#import <ApplicationServices/ApplicationServices.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        CGImageRef image = CGDisplayCreateImage(CGMainDisplayID());

        size_t width = CGImageGetWidth(image);
        size_t bpr = CGImageGetBytesPerRow(image);
        size_t bpp = CGImageGetBitsPerPixel(image);
        size_t bpc = CGImageGetBitsPerComponent(image);
        size_t bytes_per_pixel = bpp / bpc;

        NSLog(@"%li %li", bpr/bytes_per_pixel, width);

        CGImageRelease(image);

    }
    return 0;
}
macos cocoa framebuffer cgimageref
1个回答
19
投票

每行的字节数(也称为“步幅”)可以大于图像的宽度。每行末尾的额外字节将被简单地忽略。

(x, y)
处像素的字节从偏移量
y * bytesPerRow + x * bytesPerPixel
开始。

请注意,1376 可以被 32(以及所有较小的 2 的幂)整除,而 1366 则不能。现代 Mac 中的 CPU 具有一次操作 16 或 32 或 64 字节的指令,因此如果图像的步长是 16 或 32 或 64 的倍数,

CGImage
算法会更有效。
CGDisplayCreateImage
是由知道这个的人。

© www.soinside.com 2019 - 2024. All rights reserved.