Specify pixel format when getting a screenshot, output to mmap-ed region


#1

I’m working on a script that takes a Panda scene screenshot and writes it to some pseudo-device that expects that data to be in SRGB/BGR format. I’m using the following snippet to get the screenshot:

# self is instance of ShowBase
props = WindowProperties.getDefault()
props.setOrigin(0, 0)
props.setSize(width, height)
props.setFixedSize(True)

offwindow = self.openWindow(props, makeCamera=False, type="offscreen", requireWindow=True)
display_region = offwindow.makeDisplayRegion(0.0, 1.0, 0.0, 1.0)

self.graphicsEngine.renderFrame()
texture = display_region.getScreenshot()
numpy_image = memoryview(texture.getRamImage())

The problem is that in order to match the output device’s pixel format I need to convert the obtained image from ABGR to BGR:

numpy_image = np.reshape(numpy_image, (width, height, 4)
numpy_image = numpy_image[:, :, 0:3]

and this conversion introduces some significant overhead.

Is there a way to have Panda output screenshots to Texture with some given pixel format (BGR, 3 bytes per pixel)? Also, is it possible to tell Panda to actually output the image to a memory-mapped region rather than to a Texture object?

Thank you!


#2

You can use getRamImageAs("RGB"), which will reorder the components as needed.


#3

Thank you, but it seems that such call simply does a conversion internally, so the overhead is still there, and it’s even bigger than if converting manually.