Предполагая, что p1 - начало координат, а другая точка - противоположный угол прямоугольника, вы можете сделать это:
CGRect rect = CGRectMake(p1.x, p1.y, fabs(p2.x-p1.x), fabs(p2.y-p1.y));
Мой текущий рабочий проект состоит из программы просмотра / анализа изображений, способной загружать изображения размером более 16 ГБ. Вы должны использовать ввод-вывод файла вручную, извлекать информацию из заголовка и создавать свои фрагменты изображения по запросу (или, если вы обрабатываете изображение, вы можете создать одну плитку и обработать ее на месте). Очень немногие библиотеки дадут вам возможность загружать / изменять изображение размером 20k на 20k (1,2gb при 24bpp), а те, которые это делают, редко будут делать это с чем-то похожим на производительность (если это вызывает беспокойство).
Не знаю, поможет ли это, но вот статья о обработке изображений с помощью лямбда-выражений C # .