Почему вы вообще используете таймер?Почему бы просто не иметь двойной цикл for в вашей функции, который перебирает все возможные x- и y-координаты изображения?Конечно, это будет быстрее, чем проверка не более 100 пикселей в секунду.Вы хотели бы иметь координаты x (ширина) во внешнем цикле и координаты y (высота) во внутреннем цикле, чтобы эффективно сканировать один столбец пикселей за раз слева направо, поскольку вы пытаетесь найтисамый левый черный пиксель.
Кроме того, вы уверены, что каждый пиксель в вашем изображении имеет 4-байтовое (Uint32) представление?Стандартное растровое изображение будет иметь 3 байта на пиксель.Чтобы проверить, близок ли пиксель к черному, нужно просто изучить каждый байт в пикселе по отдельности и убедиться, что все они меньше некоторого порогового значения.
РЕДАКТИРОВАТЬ: ОК, так как вы используете UIGetScreenImage, япредположим, что это 4 байта на пиксель.
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
}
}
}
Если окажется, что bytesPerPixel равен 3, измените это значение соответствующим образом, удалите alphaVal из цикла for и вычтите 1 из индексовкрасного, зеленого и синего значений.
Кроме того, в настоящее время я понимаю, что UIGetScreenImage считается частной функцией, которую Apple может или не может отклонить вас за использование.