Похоже, что разрешение передней (селфи) камеры на старых устройствах ниже, поэтому вам нужно увеличить масштаб видео, если вы хотите, чтобы оно использовало всю ширину или высоту.Поскольку вы уже используете CIContext и Metal, вы можете просто дать команду вызову рендеринга нарисовать изображение в любом понравившемся прямоугольнике.
В вашем методе draw
вы выполняете self.context!.render(inputImage, to: currentDrawable.texture, commandBuffer: commandBuffer, bounds: inputImage.extent, colorSpace: self.colorSpace!)
- bounds
аргумент - это прямоугольник destination , в котором будет отображаться изображение.В настоящее время вы используете экстент изображения, что означает, что изображение не будет масштабироваться.
Чтобы увеличить масштаб видео, используйте вместо этого прямоугольник дисплея.Вы можете просто использовать metalBufferView.bounds
, так как это будет размер вашего дисплея.В итоге вы получите self.context!.render(inputImage, to: currentDrawable.texture, commandBuffer: commandBuffer, bounds: self.metalBufferView.bounds, colorSpace: self.colorSpace!)
Если изображение и вид имеют разные соотношения сторон (ширина / высота - это соотношение сторон), то вам нужно будет вычислить правильный размер так, чтобы аспект изображениясоотношение сохраняется.Чтобы сделать это, вы получите код, подобный следующему:
CGRect dest = self.metalBufferView.bounds;
CGSize imageSize = inputImage.extent.size;
CGSize viewSize = dest.size;
double imageAspect = imageSize.width / imageSize.height;
double viewAspect = viewSize.width / viewSize.height;
if (imageAspect > viewAspect) {
// the image is wider than the view, adjust height
dest.size.height = 1/imageAspect * dest.size.width;
} else {
// the image is taller than the view, adjust the width
dest.size.width = imageAspect * dest.size.height;
// center the tall image
dest.origin.x = (viewSize.width - dest.size.width) / 2;
}
Надеюсь, что это полезно, пожалуйста, дайте мне знать, если что-то не работает, или было бы полезно разъяснение.