我有一个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
}
}
}
但是,我不知道如何应用算法。
答案 0 :(得分:1)
是的,这是一种相当简单的方法。例如,您可以迭代并查看像素的百分比是纯黑色(即剪切阴影)还是接近黑色。或者,您可以在整个图像中平均像素颜色,看它是否低于某个阈值。有很多方法,这两种方法可能有点简单,但我不确定这是否需要任何特别复杂的东西。您想要使用的阈值取决于您。
此外,虽然它几乎没有实际影响,但如果我对算法很挑剔,我可能只会执行&#34;亮度&#34;如果alphaVal
超过某个阈值,则逻辑也是如此,因为颜色信息在图像的透明部分是无意义的。话虽如此,真实照片很少有透明度,所以这可能不是问题。
仅供参考,这里是Apple's code for retrieving the pixel buffer。它是一个老人,但是一个好东西。 (如果我没记错的话,唯一的麻烦就是kCGImageAlphaPremultipliedFirst
中的CreateARGBBitmapContext
引用必须与(CGBitmapInfo)
一起投射。)
顺便说一句,如果您尝试确定特定像素的亮度,一种常见的算法是:
luminance = 0.2126 * red + 0.7152 * green + 0.0722 * blue