Обрезка изображения и рендеринг в CVPixelBuffer

#ios #shader #core-image #cifilter

#iOS #шейдер #ядро-изображение #cifilter

Вопрос:

У меня есть следующий код для обрезки изображения и рендеринга в CVPixelBuffer, который, к сожалению, не работает. Некоторая часть изображения с левой стороны черная или зеленая. Интересно, что я делаю не так?

     _ciContext = CIContext(mtlDevice: metalDevice, options: [CIContextOption.useSoftwareRenderer: false])



        let dstWidth = CVPixelBufferGetWidth(dstPixelBuffer!)
        let dstHeight = CVPixelBufferGetHeight(dstPixelBuffer!)
        
        let srcWidth = CVPixelBufferGetWidth(pixelBuffer)
        let srcHeight = CVPixelBufferGetHeight(pixelBuffer)
        
        let cropRect = CGRect(x: (srcWidth - dstWidth)/2, y: (srcHeight - dstHeight)/2, width: dstWidth, height: dstHeight)
        let dstImage = srcImage.cropped(to: cropRect)
        
        NSLog("Src image (srcImage.extent), (dstImage.extent)")
        var dstBounds = CGRect.zero
        dstBounds.size = dstImage.extent.size
        _ciContext.render(dstImage, to: dstPixelBuffer!, bounds: dstBounds, colorSpace: srcImage.colorSpace )
 

РЕДАКТИРОВАТЬ: мне пришлось применить преобразование translate к dstImage по количеству -cropRect.minX и -cropRect.minY, чтобы заставить его работать. Понятия не имею, почему. Может кто-нибудь прокомментировать правильный способ обрезки CIImage и рендеринга в CVPixelBuffer?

Комментарии:

1. В случае, если вы все равно преобразуете в CGImage позже, метод CGImage.cropping() дает ожидаемые результаты. Как вы обнаружили, CIImage.cropped() не переводит результат в начало координат.