0

У меня есть UIImagePickerViewController, где пользователь делает снимок. Моя проблема заключается в том, как узнать, прежде чем загружать фотографию на сервер, если пользователь отправляет темную фотографию. Я имею в виду абсолютно или почти черный цвет.Как узнать, является ли фотография черной или слишком темной?

я исследовал, и я нашел это:

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 
    } 
    } 
} 

Однако, я не знаю, как применить алгоритм.

ответ

1

Да, это довольно простой способ сделать это. Вы могли бы, например, перебрать и посмотреть, какой процент пикселей является чистым (например, обрезанные тени) или почти черным. Или вы можете выровнять пиксельные цвета по всему изображению и посмотреть, падает ли он ниже определенного порога. Есть много подходов, и эти два могут быть немного упрощенными, но я не уверен, что это требует чего-то особо сложного. Какой порог вы хотите использовать, зависит от вас.

Кроме того, хотя это мало практического воздействия, если бы я собирался быть придирчивым к алгоритму, я мог бы выполнять только «яркость», если alphaVal был на определенном пороге, а также информация о цвете бессмысленно на прозрачных участках изображения. Сказав это, реальные фотографии редко имеют прозрачность, поэтому это может быть не проблема.

FYI, здесь Apple's code for retrieving the pixel buffer. Это старина, но лакомство. (Если я правильно помню, только хлопоты, что kCGImageAlphaPremultipliedFirst ссылки в CreateARGBBitmapContext должен быть отлита с (CGBitmapInfo).)


Кстати, если вы пытаетесь определить яркость конкретного пикселя, один общий алгоритмом является:

luminance = 0.2126 * red + 0.7152 * green + 0.0722 * blue