How to display render stamp outside the frame?
Custom Render Stamp

(Click the image for larger version)
Based on this answer by Campbell Barton, I made a small very crappy script to put the render stamp outside the rendered frame by using the render border.
It sure could be improved by a million percent, but for my petty purposes it's good enough.
(Although, all improvement suggestions are of course full-heartedly welcomed!)

Installation

Download the Script and open it in the text editor
Adjust the settings to your liking
Press Run Script
Enable the Register option in the text editor (so it runs automatically)

Usage

Define the Monitor Aspect ratio in the script's settings. The script expands the frame vertically until the defined aspect ratio is met.


For example, if the Monitor Aspect setting in the script is set to 16:9, a 2048x858 (2.39:1) sized camera frame gets expanded (not stretched) vertically to 2048x1152 (16:9).
In other words, stuff gets added to the top and the bottom of the frame.


Define the Frame Resolution in the script's settings. The script resizes the render border accordingly.


For example, if the Frame Resolution is set to 2048x858, only that sized border render will be rendered out of the full 2048x1152 frame. The rest will be seen as black (or transparent) along with the stamp information.
In other words, the same amount of stuff gets removed from the top and the bottom of the frame and the stamp gets added.


If you change the percent value of the render resolution, run the script again in order to make the stamp's font size to adjust nicely to the correct size.


Download: custom_render_stamp.py

##############################################################
#                                                            #
#                   CUSTOM RENDER STAMP                      #
#                                                            #
##############################################################
#                                                            #
#                        Settings                            #
#                        --------                            #

# Define names to the render stamp:
Animator = 'Pedro'
Compositor = 'Fabio'

# Define the name of the scene:
Scene_Name = 'Scene'

# Define render frame resolution (without the stamp sections):
Frame_Resolution_X = 2048
Frame_Resolution_Y = 858

# Define desired full frame aspect ratio (stamp section size):
Monitor_Aspect_X = 16
Monitor_Aspect_Y = 9

##############################################################
#                                                            #
#                         Script                             #
#                         ------                             #

resx = Frame_Resolution_X
resy = Frame_Resolution_Y
aspx = Monitor_Aspect_X
aspy = Monitor_Aspect_Y

# For example 2048x858's height inside 1920x1080 (= 804)
#~ aspx / resx * resy

# For example 1920x1080's upper stamp section height (= 138)
#~ (aspy - aspx / resx * resy) / 2

# For example 2048x1152's upper stamp section height (= 147)
Stamp_Height = resx / aspx * (aspy - aspx / resx * resy) / 2

# Full frame height (= 1152)
Full_Frame_Height = resy + 2 * Stamp_Height

# Render Stamp:
import bpy
import socket

# Uncomment to automatically use the name of the current scene:
# Scene_Name = bpy.context.scene.name

def stamp_set(scene):

    render = scene.render
    Render_Percent = render.resolution_percentage
    is_cycles = (render.engine == 'CYCLES')

    render.use_stamp_note = True
    render.stamp_note_text = (
        &quot;Samples: {samples}  |  &quot;
        &quot;Aperture Radius: {aperture:.4f}  |  &quot;
        &quot;Blender {ver} {branch} {hash}  |  &quot;
        &quot;Resolution: {res_x} x {res_y}  |  &quot;
        &quot;Animator: {anim}  |  &quot;
        &quot;Compositor: {comp}  |  &quot;
        &quot;Rendernode: {hostname}&quot;
    ).format(
        samples=scene.cycles.samples if is_cycles else render.antialiasing_samples,
        aperture=scene.camera.data.cycles.aperture_size if is_cycles else &quot;NONE&quot;,
        ver=bpy.app.version_string,
        branch=bpy.app.build_branch,
        hash=bpy.app.build_hash,
        res_x=int(render.resolution_x * Render_Percent / 100),
        res_y=int(render.resolution_y * (1 - Stamp_Height * 2 / Full_Frame_Height) * Render_Percent / 100),
        hostname=socket.gethostname(),
        anim=Animator,
        comp=Compositor,
        )

bpy.app.handlers.render_pre.append(stamp_set)

# Set Render Resolution Width:
bpy.data.scenes[Scene_Name].render.resolution_x = Frame_Resolution_X

# Use Render Border:
bpy.data.scenes[Scene_Name].render.use_border = True

# Render Stamp font size:
bpy.data.scenes[Scene_Name].render.stamp_font_size = 18 * bpy.data.scenes[Scene_Name].render.resolution_percentage / 100

# Set Render Borders:
bpy.data.scenes[Scene_Name].render.resolution_y = Full_Frame_Height
bpy.data.scenes[Scene_Name].render.border_min_y = Stamp_Height / Full_Frame_Height
bpy.data.scenes[Scene_Name].render.border_max_y = 1 - Stamp_Height / Full_Frame_Height