2014-09-25 3 views
0

Я проверяю, является ли 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; 

Я могу только обрезать эту часть изображения, но это будет неэффективным способом, и это было время.

ответ

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=0, yy=2.0*image.height/3.0 и toX и toY равной ширины и высоты изображения, соответственно. Перемещайте цвета в возвращаемом массиве и вычисляйте яркость, как предлагает ваш пост.

+0

спасибо очень много, это отличный ответ. – Curnelious

+0

рад помочь. будущие читатели должны заметить, что этот метод не захватывает пиксель пикселя изображения из данных изображения. скорее, он берет линии сканирования между «точками», подразумеваемыми параметрами. – danh