Save render result with custom file format and settings

Hi
I want to save rendered image with different render setting from the scene settings
and i don’t want to change scene settings because scene render settings is set for mp4 output and i just want to save a jpg snapshot of viewport rendered with opengl.
i’ve written a script that creates a temp scene and set jpg render settings for that and tries to save the render result image with that settings but fails with an error code…
below is the script and the error code.

import bpy

C = bpy.context

scenes = bpy.data.scenes

temp = scenes.new('Temp')
settings = temp.render.image_settings
settings.file_format = 'JPEG'
settings.quality = 90

filepath = "C:\\Temp.jpg"
img = bpy.data.images['Render Result']
img.save_render(filepath, temp)
scenes.remove(temp)

Error: Could not acquire buffer from image

any body…

some body…

plzz…
:smiley:

You can just save the old settings, set the new ones, and later return them to the original state:

import bpy

C = bpy.context

scene = C.scene

settings = scene.render.image_settings
old_format = settings.file_format
old_quality = settings.quality
settings.file_format = 'JPEG'
settings.quality = 90

filepath = "/tmp/Temp.jpg"

# bpy.ops.render.render() # uncomment if you want to render here

img = bpy.data.images['Render Result']
img.save_render(filepath, scene=scene)

settings.file_format = old_format
settings.quality = old_quality

Hi
I’ve tested this method, the problem is if i change format then return to that, some other parameters will change to default value. for example if the container paramter for FFmpeg is set to MP4 and i change format to JPEG then return to FFmpeg the container will change to default value which is MKV, so does the other parameters like codec, quality, … and i have to keep track of that parameters and sub-parameters…
I was looking for a simpler method to put some temp override settings for saving a quick snapshot…
i tried to keep a copy of render settings with sth like:

old_settings = scene.render.image_settings.copy()

but there is no copy method for that.
maybe a recursive iteration of getting and setting of all the non read-only parameters is the only solution…

Thank you for the help. :pray:

The same with saving ffmpeg settings:

import bpy

C = bpy.context

scene = C.scene

settings = scene.render.image_settings
old_ff_settings = {}
for attr in dir(scene.render.ffmpeg):
    if attr not in ['__doc__', '__module__', '__slots__', 'bl_rna', 'rna_type']:
        old_ff_settings[attr] = getattr(scene.render.ffmpeg, attr)

old_format = settings.file_format
old_quality = settings.quality
settings.file_format = 'JPEG'
settings.quality = 90

filepath = "/tmp/Temp.jpg"

print(bpy.ops.render.render())

img = bpy.data.images['Render Result']
img.save_render(filepath, scene=scene)

settings.file_format = old_format
settings.quality = old_quality

for key in old_ff_settings:
    setattr(scene.render.ffmpeg, key, old_ff_settings[key])

This solves the problem
Thanks :pray: :rose:

Here is the final code which also accounts for other image formats settings not only ffmpeg.

import bpy

scene = bpy.context.scene
settings = scene.render.image_settings

old_format = settings.file_format

if old_format == 'FFMPEG':
    format_settings = scene.render.ffmpeg
else:
    format_settings = scene.render.image_settings
    
old_settings = {}
for prop in format_settings.bl_rna.properties:
    if not prop.is_readonly:                
        key = prop.identifier
        old_settings[key] = getattr(format_settings, key)

settings.file_format = 'JPEG'
settings.quality = 90
filepath = "/tmp/Temp.jpg"

img = bpy.data.images['Render Result']
img.save_render(filepath)

settings.file_format = old_format
for key in old_settings:
    setattr(format_settings, key, old_settings[key])
1 Like