gpt4 book ai didi

iphone - 如何获取相机屏幕上指定点像素的RGB值?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:09:18 25 4
gpt4 key购买 nike

我想以 RGB 形式获取相机屏幕上指定点的颜色值(不捕获)。

我有以下代码片段,但它给出了 View 背景颜色的值,而不是相机屏幕上的图片。

CGPoint point=CGPointMake(100,200);
unsigned char pixel[4] = {0};
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, kCGImageAlphaPremultipliedLast);

CGContextTranslateCTM(context, -point.x, -point.y);
[self.view.layer renderInContext:context];

CGContextRelease(context);
CGColorSpaceRelease(colorSpace);

NSLog(@"pixel: R=%d G=%d B=%d Alpha=%d", pixel[0], pixel[1], pixel[2], pixel[3]);

最佳答案

假设您想实时执行此操作(而不是使用屏幕截图,您明确表示您想要这样做):

您首先需要捕获视频缓冲区 as outlined by Apple here

然后你可以用 CMSampleBufferRef 做你想做的事. Apple 的示例应用程序生成一个 UIImage , 但您可以简单地将其复制到 unsigned char 中指针(通过 CVImageBufferRefCVPixelBufferRef ),然后拉出相关像素的 BGRA 值,如下所示(未经测试的代码:示例是针对 100x,200y 处的像素):

int x = 100;
int y = 200;
CVPixelBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0);
tempAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
int bufferSize = bytesPerRow * height;
uint8_t *myPixelBuf = malloc(bufferSize);
memmove(myPixelBuf, tempAddress, bufferSize);
tempAddress = nil;
// remember it's BGRA data
int b = myPixelBuf[(x*4)+(y*bytesPerRow)];
int g = myPixelBuf[((x*4)+(y*bytesPerRow))+1];
int r = myPixelBuf[((x*4)+(y*bytesPerRow))+2];
free(myPixelBuf);
NSLog(@"r:%i g:%i b:%i",r,g,b);

这会获取相对于视频源本身像素的位置,这可能不是您想要的:如果您想要像素的位置显示在 iPhone 的显示屏上,您可能需要对其进行缩放。

关于iphone - 如何获取相机屏幕上指定点像素的RGB值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12193992/

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