por*_*omp 5 macos cocoa framebuffer cgimageref
我正在尝试从屏幕缓冲区中读取像素,我正在创建一个CGImageRefwith 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;
}
Run Code Online (Sandbox Code Playgroud)
rob*_*off 14
每行的字节数(也称为"步幅")可以大于图像的宽度.简单地忽略每行末尾的额外字节.(x, y)偏移处开始时像素的字节数y * bpr + x * bpp(其中bpr每行bpp的字节数为每像素字节数).
请注意,1376可以被32整除(并且所有较小的幂都为2),而1366则不是.现代Mac中的CPU具有一次操作16或32或64字节的指令,因此CGImage如果图像的步幅是16或32或64的倍数,则算法可以更有效. CGDisplayCreateImage由知道这一点的人编写.
| 归档时间: |
|
| 查看次数: |
624 次 |
| 最近记录: |