objective-c - 检测图像iOS中的黑色像素

标签 objective-c ios image colors pixel

到目前为止,我正在逐个搜索每个像素,检查颜色并查看它是否为黑色......如果不是,我将继续下一个像素。这需要很长时间,因为我只能检查大约。每秒 100 像素(加速我的 NSTimer 会卡住应用程序,因为它检查速度不够快。)所以无论如何我可以让 Xcode 返回所有黑色像素并忽略其他所有内容,所以我只需要检查这些像素而不是每个像素。我正在尝试检测图像左侧最远的黑色像素。

这是我当前的代码。

- (void)viewDidLoad {
    timer = [NSTimer scheduledTimerWithTimeInterval: 0.01
                                             target: self
                                           selector:@selector(onTick:)
                                           userInfo: nil repeats:YES];
    y1 = 0;
    x1 = 0;
    initialImage = 0;
    height1 = 0;
    width1 = 0;
}

-(void)onTick:(NSTimer *)timer {
    if (initialImage != 1) {
        /*
        IMAGE INITIALLY GETS SET HERE... "image2.image = [blah blah blah];" took this out for non disclosure reasons
        */
        initialImage = 1;
    }
    //image2 is the image I'm checking the pixels of.
    width1 = (int)image2.size.width;
    height1 = (int)image2.size.height;
    CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(image2.CGImage));
    const UInt32 *pixels = (const UInt32*)CFDataGetBytePtr(imageData);
    if ( (pixels[(x1+(y1*width1))]) == 0x000000) { //0x000000 is black right?
        NSLog(@"black!");
        NSLog(@"x = %i", x1);
        NSLog(@"y = %i", y1);
    }else {
        NSLog(@"val: %lu", (pixels[(x1+(y1*width1))]));
        NSLog(@"x = %i", x1);
        NSLog(@"y = %i", y1);
        x1 ++;
        if (x1 >= width1) {
            y1 ++;
            x1 = 0;
        }
    }
    if (y1 > height1) {
        /*
        MY UPDATE IMAGE CODE GOES HERE (IMAGE CHANGES EVERY TIME ALL PIXELS HAVE BEEN CHECKED
        */
        y1 = 0;
        x1 = 0;
    }

另外,如果一个像素非常接近黑色但不是完全黑色怎么办...我可以在某处添加一个误差范围,以便它仍然可以检测到 95% 黑色的像素吗?谢谢!

最佳答案

你为什么要使用计时器?为什么不在你的函数中有一个双 for 循环来循环图像中所有可能的 x 和 y 坐标?当然,这比每秒最多检查 100 个像素要快得多。您可能希望在外循环中有 x(宽度)坐标,在内循环中有 y(高度)坐标,这样您就可以一次有效地从左到右扫描一列像素,因为您正在尝试查找最左边的黑色像素。

另外,您确定图像中的每个像素都有一个 4 字节 (Uint32) 表示吗?标准位图每个像素有 3 个字节。要检查像素是否接近黑色,您只需分别检查像素中的每个字节并确保它们都小于某个阈值。

编辑:好的,因为您使用的是 UIGetScreenImage,我将假设它是每像素 4 字节。

const UInt8 *pixels = CFDataGetBytePtr(imageData);
UInt8 blackThreshold = 10; // or some value close to 0
int bytesPerPixel = 4;
for(int x = 0; x < width1; x++) {
  for(int y = 0; y < height1; y++) {
    int pixelStartIndex = (x + (y * width1)) * bytesPerPixel;
    UInt8 alphaVal = pixels[pixelStartIndex]; // can probably ignore this value
    UInt8 redVal = pixels[pixelStartIndex + 1];
    UInt8 greenVal = pixels[pixelStartIndex + 2];
    UInt8 blueVal = pixels[pixelStartIndex + 3];
    if(redVal < blackThreshold && blueVal < blackThreshold && greenVal < blackThreshold) {
      //This pixel is close to black...do something with it
    }
  }
}

如果 bytesPerPixel 为 3,则相应地更改该值,从 for 循环中删除 alphaVal,并从红色、绿色和蓝色值的索引中减去 1。

另外,我目前的理解是 UIGetScreenImage 被认为是 Apple 可能会或可能不会拒绝您使用的私有(private)函数。

关于objective-c - 检测图像iOS中的黑色像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8955110/

相关文章:

ios - 如何将 UITableView 中的单元格颜色设置为透明?

ios - Objective-C if语句评估

ios - UITableView 中的嵌套数据

ios - 在 textview iOS 中处理按钮

image - 私有(private) docker 注册表文件夹结构

objective-c - 向 NSTabviewitem 添加关闭按钮

iphone - 比较两个数组并获取共同项

ios - 内部名称 swift 2.0+?

android加载SD卡中图像的缩略图

php - 使用php从mysql数据库获取图像