Вы не можете сделать это напрямую из UIImage, но вы можете визуализировать изображение в растровом контексте с предоставленным вами буфером памяти, а затем напрямую протестировать память.
Это звучит сложнее, чем на самом деле, но все же может быть сложнее, чем вы хотели услышать.
Если у вас есть поваренная книга Эрика Садуна для разработчиков iPhone, ее можно найти на стр. 54. Я бы порекомендовал эту книгу в целом, поэтому стоит ее приобрести, если у вас ее нет.
Я пришел к почти одинаковому коду независимо, но столкнулся с одной ошибкой, которая, похоже, может быть и в коде Садуна. В методе pointInside значения точек и размеров являются числами с плавающей точкой и умножаются вместе как числа с плавающей точкой перед приведением к типу int. Это хорошо, если ваши координаты являются дискретными значениями, но в моем случае я предоставлял субпиксельные значения, поэтому формула не работает. Конечно, исправить это легко, как только вы определили проблему - просто приведите каждую координату к целому числу перед умножением - так, в случае Садуна это будет:
long startByte = ((int)point.y * (int)size.width) + (int)point.x) * 4;
Кроме того, код Садуна, как и мой, интересуют только альфа-значения, поэтому мы используем 8-битные пиксели, которые принимают только альфа-значение. Изменение вызова CGBitMapContextCreate должно также позволить вам получить фактические значения цвета (очевидно, если у вас больше 8 бит на пиксель, вам придется умножить это и на формулу pointInside).
[править]
Это побудило меня разместить код в моем блоге (с дополнительным указанием, пока я разобрался, как его подсветить синтаксисом):