SOLVED Take Viewport Screenshot

Hi,

Is there a way to take a viewport screenshot (i.e. exactly what the viewport is displayed)?
I have a WIP code but it uses a camera independent of the current camera the viewport is looking at:

You can also check the illustration of the problem here:
https://www.dropbox.com/s/qtzemdng92w13od/c4d190_take_viewport_picture.mp4?dl=0

def main():
    bmp = doc.GetDocPreviewBitmap()
    c4d.bitmaps.ShowBitmap(bmp)
    c4d.EventAdd()

Thank you for looking at my problem

Hello,

just FYI: GetDocPreviewBitmap() returns the image that is stored in the c4d file and that is used as a thumbnail image. It is created when the scene is saved; it has nothing to do with the current viewport image.

You have to make render with Software Renderer.

There's also the "Send to Picture Viewer" command (by default in viewport View menu), command ID is 300001097, which would fit your purpose quite well...
Unfortunately it has some downsides, when trying to use it from code instead of from the UI.

  • With multiple viewports you lack an option to choose the viewport, instead the active one will be taken.
  • With multiple viewports there's a bug, which sometimes leads to a black image.

Cheers

Edit: Forget it, playing around with it, I think it is broken for every other than the first viewport (regardless of code or UI). Sorry.

hello,

as @mikeudin said you have to render the document using Software renderer.
Change the render setting to software/hardware renderer, use RenderDocument and retrieve the result.
After that, change back the render engine to what it was.

import c4d
from c4d import gui


# Main function
def main():
     # Retrieves the current active render settings
    rd = doc.GetActiveRenderData()
    saved = rd[c4d.RDATA_RENDERENGINE] 
    rd[c4d.RDATA_RENDERENGINE]  = c4d.RDATA_RENDERENGINE_PREVIEWHARDWARE
    
    # Creates a Multi Pass Bitmaps that will store the render result
    bmp = c4d.bitmaps.MultipassBitmap(int(rd[c4d.RDATA_XRES]), int(rd[c4d.RDATA_YRES]), c4d.COLORMODE_RGB)
    if bmp is None:
        raise RuntimeError("Failed to create the bitmap.")

    # Adds an alpha channel
    bmp.AddChannel(True, True)

    # Renders the document
    if c4d.documents.RenderDocument(doc, rd.GetData(), bmp, c4d.RENDERFLAGS_EXTERNAL) != c4d.RENDERRESULT_OK:
        raise RuntimeError("Failed to render the temporary document.")

    # Displays the render in the Picture Viewer
    c4d.bitmaps.ShowBitmap(bmp)

    rd[c4d.RDATA_RENDERENGINE] = saved

if __name__ == "__main__":
    main()


Cheers,
Manuel

Thank you all for the response. Appreciate a lot.

Specially for the sample code provided by @m_magalhaes as this is my code relating to rendering.