6
$\begingroup$

I want to modify every frame in an animation after it has been saved as an image. Since bpy.data.images["Render Result"] doesn't have associated data I need to load it from disk.

How do I get the path of the last rendered frame in a render_post handler?

$\endgroup$
5
$\begingroup$

The filepath is stored in:

bpy.context.scene.render.filepath

However there is a function to find the output filename for a frame (the same function blender users internally).

output = bpy.context.scene.render.frame_path(frame=10)

example use:

>>> bpy.context.scene.render.filepath = "/test/some_###_anim.png"
>>> bpy.context.scene.render.frame_path(frame=10)
'/test/some_010_anim.png'
| improve this answer | |
$\endgroup$
2
$\begingroup$

You'll probably want to use context.scene.render.filepath and append the frame number with (using str.zfill(4) where str is the frame number as a string and 4 is the number of digits), and extension using context.scene.render.image_settings.file_format, converted to lower case (using str.lower()).

| improve this answer | |
$\endgroup$
  • $\begingroup$ What about '#' in the output filepath? $\endgroup$ – Maccesch Oct 15 '13 at 13:09
  • $\begingroup$ '#' indicates padding, so you could count the number of '#'s after the last slash (in case folder names have hashes) and use that instead of 4 $\endgroup$ – Greg Zaal Oct 15 '13 at 13:25
  • $\begingroup$ You'd also have to remove the hashes from the output path using str.replace('#', '') $\endgroup$ – Greg Zaal Oct 15 '13 at 13:32
  • $\begingroup$ Could you update your answer with a complete code example for all this please? $\endgroup$ – Maccesch Oct 15 '13 at 13:39
  • 1
    $\begingroup$ Now that would make it too easy wouldn't it ;) Figuring it out by yourself will teach you something. If you're still stuck tomorrow then I'll code it for you. $\endgroup$ – Greg Zaal Oct 15 '13 at 18:05
-1
$\begingroup$

The expression you want is bpy.context.scene.render.frame_path()

Calling frame_path without specifying a frame uses the current frame.

import bpy

def handle_render_write(scn):
    print(scn.render.frame_path())

bpy.app.handlers.render_write.append(handle_render_write)
| improve this answer | |
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.