Skip to main content
1 of 8
ideasman42
  • 48k
  • 10
  • 144
  • 226

No, this feature isn't supported by Blender, but using an add-on and image-magick, this can be done.

Imagemagick will need to be installed and the command convert will need to be in your path.

Save this file as render_cmyk.py and install it via Blenders's add-on preferences.

Once installed, the render output panel will have a checkbox to write out CMYK PSD images along side the image format your rendering too.

When rendering an animation it will create a CMYK version of images written to disk.

If you need to use ICC profiles, these can be passed as arguments too, see Imagemagick documentation.

bl_info = {
    "name": "Render CMYK",
    "version": (1, 0),
    "blender": (2, 77, 0),
    "location": "Render Properties -> Output",
    "description": "Converts an image to CMYK when saving out animation renders",
    "warning": "",
    "wiki_url": "",
    "category": "Render",
    }

import bpy
from bpy.props import BoolProperty
from bl_ui.properties_render import RENDER_PT_output
from bpy.app.handlers import persistent

@persistent
def render_write_cmyk(scene):
    import os
    import subprocess

    if scene.use_render_cmyk:
        filepath_src = scene.render.frame_path()
        filepath_dst = os.path.splitext(filepath_src)[0] + ".psd"
        if os.path.exists(filepath_src):
            cmd = (
                "convert",
                filepath_src,
                "-colorspace", "cmyk",
                filepath_dst,
                )
            print("Running:", " ".join(cmd))
            subprocess.check_call(cmd)
        else:
            print("File not found for conversion %r" % filepath)


def draw(self, context):
    layout = self.layout
    layout.prop(context.scene, "use_render_cmyk")


def register():
    bpy.types.Scene.use_render_cmyk = BoolProperty(name="Write CMYK/PSD")
    RENDER_PT_output.append(draw)
    bpy.app.handlers.render_write.append(render_write_cmyk)


def unregister():
    del bpy.types.Scene.use_render_cmyk
    RENDER_PT_output.remove(draw)
    bpy.app.handlers.render_write.remove(render_write_cmyk)

if __name__ == "__main__":
    register()
ideasman42
  • 48k
  • 10
  • 144
  • 226