gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:09:57 25 4
gpt4 key购买 nike

我正在尝试从屏幕缓冲区中读取像素,我正在使用 CGDisplayCreateImage 创建一个 CGImageRef,但 CGImageGetWidth 的值> 和 CGI​​mageGetBytesPerRow 放在一起没有意义,将每行字节数除以每像素字节数得到每行 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;
}

最佳答案

每行的字节数(也称为“步幅”)可以大于图像的宽度。每行末尾的额外字节将被简单地忽略。 (x, y) 处像素的字节从偏移量 y * bpr + x * bpp 开始(其中 bpr 是每字节字节数)行和 bpp 是每像素字节数)。

请注意,1376 可以被 32(以及所有较小的 2 的幂)整除,而 1366 则不能。现代 Mac 中的 CPU 具有一次操作 16 或 32 或 64 字节的指令,因此如果图像的步幅是 16 或 32 或 64 的倍数,CGImage 算法会更高效。CGDisplayCreateImage 是由了解这一点的人编写的。

关于macos - CGImageRef 宽度与每行字节数不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25706397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com