Рендеринг небольшого CIImage с центром в MTKView - PullRequest
0 голосов
/ 19 февраля 2019

Я рендеринг от CIImage до MTKView, и изображение меньше, чем рисовать.

let centered = image.transformed(by: CGAffineTransform(translationX: (view.drawableSize.width - image.extent.width) / 2, y: (view.drawableSize.height - image.extent.height) / 2))
context.render(centered, to: drawable.texture, commandBuffer: buffer, bounds: centered.extent, colorSpace: CGColorSpaceCreateDeviceRGB())

Я ожидаю, что приведенный выше код отобразит изображение в центре представления, но вместо этого изображение расположено в исходной точке.

Вот репозиторий, иллюстрирующий проблему: https://github.com/truemetal/centered-render-of-ciimage-to-mtkview

Прежде чем обвинять Metal или CoreImage Я хотел бы убедиться, что я не делаю что-то не так.

Буду признателен за ссылку на документацию, в которой говорится, что я не могу сделать что-то подобное.

problem screenshot

Я могу обойти этоэто путем наложения изображения поверх другого, которое будет точно такого же размера, как и рисованный объект, но мне все еще интересно, почему именно приведенный выше код не работает.

let centered = image.transformed(by: CGAffineTransform(translationX: (view.drawableSize.width - image.extent.width) / 2, y: (view.drawableSize.height - image.extent.height) / 2))
let background = CIImage(color: .white).cropped(to: CGRect(origin: .zero, size: view.drawableSize))
let preparedImage = centered.composited(over: background)
self.context.render(preparedImage, to: drawable.texture, commandBuffer: buffer, bounds: preparedImage.extent, colorSpace: CGColorSpaceCreateDeviceRGB())

1 Ответ

0 голосов
/ 20 февраля 2019

Это очень любопытно.Если вы используете «новый» CIRenderDestination API вместо context.render(…), он на самом деле работает:

let destination = CIRenderDestination(width: Int(view.drawableSize.width),
                                      height: Int(view.drawableSize.height),
                                      pixelFormat: view.colorPixelFormat,
                                      commandBuffer: buffer,
                                      mtlTextureProvider: { () -> MTLTexture in
                                          return drawable.texture
                                      })
try! self.context.startTask(toRender: centered, to: destination)

Я не знаю почему, но context.render(…), похоже, не соответствует переводуизображение или данные границы.Может быть, кто-то еще знает больше ...

...