【问题标题】:FAST pixel sampling快速像素采样
【发布时间】:2013-09-12 11:55:40
【问题描述】:

我需要尽快从图像中获取 RBG 数据。我目前这样做:

CGRect rect = CGRectMake(roundf(xCoord * self.scale), roundf(yCoord * self.scale), 1, 1);
CGImageRef cropped = CGImageCreateWithImageInRect(self.CGImage, rect);

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

unsigned char rawData[UIIMAGE_BYTES_PER_PIXEL];
NSUInteger bytesPerRow = UIIMAGE_BYTES_PER_PIXEL;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, 1, 1,
                                             bitsPerComponent, bytesPerRow, colorSpace,
                                             kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context, CGRectMake(0, 0, 1, 1), cropped);

CGImageRelease(cropped);
CGContextRelease(context);

CGFloat red   = rawData[0] / 255.0;
CGFloat green = rawData[1] / 255.0;
CGFloat blue  = rawData[2] / 255.0;
CGFloat alpha = rawData[3] / 255.0;

return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];    

但是太慢了。

有没有人有代码 sn-p 使用 Open GL 纹理来代替?我已经查看了 GPUImage 项目以尝试获得一个起点,但是仅仅为了这一点而必须学习所有关于 OpenGL 的知识是压倒性的。

【问题讨论】:

  • 您是否正在为您需要的每个像素创建图像、上下文和 UIColor?那会很慢——当/如果您只需要渲染到更大的位图(即使用一个图像和数百个像素的上下文)。 OpenGL 不会帮你渲染一个像素。
  • 另外,您需要先将这些颜色分量值解相乘,然后再将它们传递给UIColor(除非您绝对确定您的输入图像完全不透明)。
  • 确实,我一直很傻。

标签: ios opengl-es core-graphics core-image


【解决方案1】:

正如贾斯汀所指出的,这里最好的方法是一次性获取所有像素数据,然后访问它们。像我一样一次获取一个像素的数据非常非常慢。

【讨论】:

    猜你喜欢
    • 2021-09-09
    • 2023-03-24
    • 2014-02-01
    • 2019-04-12
    • 2011-09-05
    • 2014-10-06
    • 1970-01-01
    • 2016-01-23
    • 2012-06-17
    相关资源
    最近更新 更多