检查图像是否仅黑暗底部

时间:2014-09-25 14:09:51

标签: objective-c

我正在检查UIImage是否更暗或更白。我想使用这种方法,但只是检查图像的第三个底部,而不是全部。 我想知道如何改变它来检查它,我不熟悉像素的东西。

    BOOL isDarkImage(UIImage* inputImage){

        BOOL isDark = FALSE;

        CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(inputImage.CGImage));
        const UInt8 *pixels = CFDataGetBytePtr(imageData);

        int darkPixels = 0;

        long length = CFDataGetLength(imageData);
        int const darkPixelThreshold = (inputImage.size.width*inputImage.size.height)*.25;

//should i change here the length ?
        for(int i=0; i<length; i+=4)
        {
            int r = pixels[i];
            int g = pixels[i+1];
            int b = pixels[i+2];

            //luminance calculation gives more weight to r and b for human eyes
            float luminance = (0.299*r + 0.587*g + 0.114*b);
            if (luminance<150) darkPixels ++;
        }

        if (darkPixels >= darkPixelThreshold)
            isDark = YES;

我可以裁剪图像的那一部分,但这不是有效的方式,而是浪费时间。

1 个答案:

答案 0 :(得分:2)

solution marked correct here是获取像素数据(更能容忍不同格式)的更周到的方法,还演示了如何处理像素。通过小幅调整,您可以按如下方式获得图像的底部:

+ (NSArray*)getRGBAsFromImage:(UIImage*)image 
                          atX:(int)xx
                         andY:(int)yy
                          toX:(int)toX
                          toY:(int)toY {

    // ...
    int byteIndex = (bytesPerRow * yy) + xx * bytesPerPixel;
    int byteIndexEnd = (bytesPerRow * toY) + toX * bytesPerPixel;
    while (byteIndex < byteIndexEnd) {
        // contents of the loop remain the same

    // ...
}

要获得图片的底部三分之一,请分别使用xx=0yy=2.0*image.height/3.0toX以及toY调用此图片的宽度和高度。循环返回的数组中的颜色并按照帖子的建议计算亮度。