Для приложения, которое я разрабатываю, я позволяю пользователю указывать размеры объекта, который они хотят захватить на камеру (например, 30 "x 40"). Следующее, что я хочу сделать, - показать канал камеры с помощью камерыOverlayView поверх нее, показывая только гладкий прозрачный квадрат, который имеет правильное соотношение для захвата этого объекта.Вырезание предопределенной части фотографии с камеры
Так что я попробовал 2 вещи, чтобы получить эту работу:
Используйте UIViewController, который использует AVCaptureVideoPreviewLayer
для отображения представления с живым кормом видео. В верхней части этого канала я показываю прозрачный вид, который рисует квадрат с правильными размерами (с использованием отношения, указанного пользователем).
и
В очередной попытке я создал UIViewController, содержащий кнопку, которая всплывает UIImagePickerController
. Используя этот контроллер, я также создал представление, которое я прикрепляю к сборщику, используя свойство cameraOverlayView
.
Основная проблема, с которой я сталкиваюсь в обоих этих методах, состоит в том, что изображение, которое на самом деле захвачено, всегда больше, чем то, что я вижу на экране, но я не совсем уверен, как вырезать ЭТО часть изображения после фотография сделана.
Так, например: Отображается мой UIImagePickerController, я накладываю надпись поверх того, что показывает квадрат размером 300 x 400 пикселей. Пользователь использует этот квадрат, чтобы сделать снимок своего объекта и центрирует свой объект внутри этого квадрата.
Снимок сделан, но вместо картины, которая является 320x480 (или 640x960) я получаю результат, 3500x2400 (или что-то в этом роде. Это совершенно другое отношение, то соотношение экрана (конечно).
Как я могу убедиться, что вырезал правую часть изображения.
Код, который фактически вычисляет размер квадрата, который должен быть показан (и должен использоваться для определения того, какая часть изображения должна быть разрез):
+ (CGRect) getFrameRect:(CGRect) rect forSize:(CGSize) frameSize {
if (CGSizeEqualToSize(frameSize, CGSizeZero))
return CGRectZero;
float maxWidth = rect.size.width - 20;
float maxHeight = rect.size.height - 20;
float ratioX = maxWidth/frameSize.width;
float ratioY = maxHeight/frameSize.height;
float ratio = MIN(ratioX, ratioY);
float newWidth = frameSize.width * ratio;
float newHeight = frameSize.height * ratio;
float x = (rect.size.width - newWidth)/2;
float y = (rect.size.height - newHeight)/2;
return CGRectMake(x, y, newWidth, newHeight);
}
Это определяет наибольший квадрат, который может быть создан с отношением, указанным в параметре frameSize, с размерами, в которых квадрат должен быть нарисован в параметре rect.
Некоторые решения приходят на ум, но я не уверен, что это выполнимо.
- Уменьшить фотографию до ширины и высоты экрана (независимо от того, что на первом месте), взять центр изображения и тот же центр, который отображается при съемке? Не уверен, что это сработает, я попробовал это немного, но это не удалось.