我正在检查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;
我可以裁剪图像的那一部分,但这不是有效的方式,而是浪费时间。
答案 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=0
,yy=2.0*image.height/3.0
和toX
以及toY
调用此图片的宽度和高度。循环返回的数组中的颜色并按照帖子的建议计算亮度。