Converting to CMYK means translating each colour into ink amounts for one particular press and paper. That translation is an ICC profile, and the profile is the part that matters: the same RGB colour needs different ink on coated paper in Germany than on newsprint in Ohio. So the first step is to ask the printer which profile they want, or whether they would rather convert the file themselves.
For an image, convert from sRGB to the printer's profile, keeping in-gamut colours exact (relative colorimetric) and the shadows open (black point compensation):
magick artwork.png -depth 8 -intent Relative -black-point-compensation -profile sRGB.icc -profile FOGRA39L_coated.icc -compress lzw artwork-cmyk.tif
magick identify -format '%[colorspace] %[profile:icc]\n' artwork-cmyk.tif
CMYK FOGRA39L Coated
Install it with brew install imagemagick on a Mac, apt install imagemagick
on Debian and Ubuntu, or the installer from imagemagick.org on Windows. The
two profile files are below. For a whole PDF, use
Ghostscript.
Ask the printer first
There are two ways a printer can want the file, and they are opposite:
- "Send CMYK." Then you convert, with their profile, and you see the result before they do. Ask which profile. If they say "just CMYK", ask what paper and press it will be on.
- "Send PDF/X-4." PDF/X-4 is allowed to carry RGB images, as long as the file names the press condition it was made for (the output intent). The printer's software converts at the last moment, with the profile of the press the job actually runs on. Many printers prefer this, because a file someone else converted with the wrong profile can't be undone.
If you don't know which your printer wants, ask before you convert anything. Making the PDF/X file itself is in how to make a print-ready PDF.
Which profile
| Printing on | Profile to ask about | Where it comes from |
|---|---|---|
| Coated paper, Europe | FOGRA39 (ISO Coated v2), or the newer FOGRA51 (PSO Coated v3) | European Color Initiative downloads; Adobe apps ship Coated FOGRA39 |
| Coated paper, US commercial print | GRACoL 2013 (CRPC6) | Idealliance; Adobe apps ship Coated GRACoL 2006 |
| US magazines (web offset) | SWOP | Adobe apps ship U.S. Web Coated (SWOP) v2 |
| Uncoated paper | The uncoated one the printer names (FOGRA47 or FOGRA52 in Europe) | The printer, or the same sites |
Many printers publish the profile on their file-preparation page. Use theirs over anything in this table.
The commands here were run with the profiles in Debian's colord-data and
icc-profiles-free packages: FOGRA39L_coated.icc (built with ArgyllCMS from
the FOGRA39 data) and sRGB.icc. ISO Coated v2 and Adobe's Coated FOGRA39 are
built from the same data by other people, so their numbers won't match ours
exactly.
What happens to bright colours
A screen makes colour from light and can show greens, blues and pinks that four inks on paper cannot. The profile moves those to the nearest colour the press can print, and the nearest one is duller. Colours already inside the press's range barely change.
Six sRGB colours through FOGRA39 with the command above, then converted back to sRGB to show what the print will look like:
| sRGB | Naive formula | FOGRA39 profile | Looks like in print |
|---|---|---|---|
#00FF00 screen green |
100 0 100 0 | 63 0 96 0 | #6BB436 |
#0066FF electric blue |
100 60 0 0 | 84 53 0 0 | #256DB5 |
#FF6600 orange |
0 60 100 0 | 0 71 98 0 | #EC6414 |
#FF00FF magenta |
0 100 0 0 | 33 69 0 0 | #B466A6 |
#1F3A5F navy |
67 39 0 63 | 89 61 15 51 | #1D3A5F |
#C8102E red |
0 92 77 22 | 0 98 75 16 | #C9152F |
The navy and the red come through almost unchanged. The green, the blue and the magenta are where "it came back dull" comes from, and no profile or setting fixes that: the ink can't do it. If one of those is your brand colour, pick a printable version on purpose, or print it as a spot ink (see how to match a Pantone colour in CMYK).
The "naive formula" column is what most online converters do, ours included: it works out the ink from the RGB numbers alone, with no paper and no press. It gets the in-gamut navy wrong too, and it would print the green as solid cyan and yellow, far darker than the screen colour.
A formula's answer for screen green, and the tool's own note on what it doesn't model.
Images: the details
Untagged or tagged. The first -profile tells ImageMagick what the pixels
are now; the second converts them. If the image already carries a profile,
the first one converts from that profile to sRGB instead. Check before you
convert:
magick identify -format '%[profile:icc]\n' artwork.png
It prints the profile's name (sRGB for our test image). If it prints a
warning that %[profile:icc] is unknown, the image has no profile: keep both
-profile options. With only the CMYK one, ImageMagick attaches that profile
to the unchanged RGB pixels and converts nothing. If it names a wider space such as Adobe RGB or Display P3,
drop the sRGB one: going through sRGB first clips colours the press could
have printed. An Adobe RGB green came out as 80 0 100 0 converted directly,
and 63 0 96 0 through sRGB.
Keep -depth 8. A logo saved as a palette PNG with a handful of colours
reads as 4 bits per channel, and without -depth 8 straight after the file
name ImageMagick wrote the TIFF that way too: the green came out as 60 0 93 0
instead of 63 0 96 0, every ink rounded to steps of about 7%. Put at the end of
the command instead, it rounds a few values down by one step in 255.
Intent. Relative colorimetric keeps every colour the press can print exactly as it is and moves only the ones it can't. Perceptual squeezes the whole image to fit, so in-gamut colours move too: the navy above became 94 63 9 55 instead of 89 61 15 51. Relative with black point compensation is the usual choice for graphics and most photos; try perceptual on a photo full of saturated colour and compare.
See it before the printer does. Convert the CMYK file back to sRGB and look at the two side by side. This is a soft proof, and it is how the right column of the table was made:
magick artwork-cmyk.tif -intent Relative -black-point-compensation -profile sRGB.icc proof.png
Total ink. Each profile has a limit on how much ink the paper can take at one spot. To see the most your image uses, as a percentage of all four inks:
magick artwork-cmyk.tif -fx '(c+m+y+k)/4' -channel C -separate -format '%[fx:round(400*maxima)]%%\n' info:
216%
That is the navy. A profile conversion stays inside its own limit, so this matters more for CMYK values someone typed in by hand.
A whole PDF: Ghostscript
Ghostscript rewrites every colour in the PDF, text, shapes and images, through the profile you give it:
gs -o flyer-cmyk.pdf -sDEVICE=pdfwrite -sColorConversionStrategy=CMYK -sOutputICCProfile=FOGRA39L_coated.icc --permit-file-read=FOGRA39L_coated.icc flyer.pdf
Keep the --permit-file-read. Ghostscript 10.05.1 refuses to read a profile
from outside its own folder without it, stops with Error: /undefined in --runpdf--, and still leaves a half-written file behind. Install it with
brew install ghostscript or apt install ghostscript.
On a test flyer with a blue heading, a green panel, the six colours above as an image and a line of black text, the colours came out the same as ImageMagick's, to the percent. Then check the result:
pdfimages -list flyer-cmyk.pdf
page num type width height color comp bpc enc interp object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
1 0 image 600 100 cmyk 4 8 image no 8 0 124 124 1729B 0.7%
cmyk with 4 components is what you want. Before, it read rgb and 3.
icc with 3 components is RGB too, with a profile attached. That covers
images only. For text and shapes, count what is left in RGB (qpdf unpacks
the file so grep can read it):
qpdf --qdf --object-streams=disable flyer-cmyk.pdf - | grep -a -c -E ' (rg|RG)$|/DeviceRGB|/CalRGB|^ */N 3$'
It printed 4 for the original flyer and 0 for the converted one.
RGB black is a colour like any other, so the profile turned the black text
into 79 70 53 98: 299% ink on 12 pt letters. On a press, any misregistration
between the four plates shows as a coloured fringe on small text. Text that
was set as grey black (0 g in the PDF) stayed on the black plate only. Set
body text to black ink in the design app, or let the printer convert. To find
the heaviest spot on a page:
gs -q -o page.tif -sDEVICE=tiff32nc -r150 flyer-cmyk.pdf
magick page.tif -fx '(c+m+y+k)/4' -channel C -separate -format '%[fx:round(400*maxima)]%%\n' info:
299%
What Ghostscript does not do here: the result is a CMYK PDF, not a PDF/X
file. It has no output intent (grep -c OutputIntent found none), so a
printer's preflight can't tell which press it was converted for. Say so when
you send it.
You may see gs -sDEVICE=inkcov suggested for checking a PDF. It prints the
average coverage of each ink over the page, and it printed four CMYK numbers
for the RGB original too, because it converts as it measures. It is not a test
of whether a file is CMYK.
In a design app
If the file comes out of a design app, convert there. The app knows which black is text, keeps spot colours and can write a real PDF/X file.
- InDesign: File › Export, Adobe PDF (Print), preset PDF/X-4:2008. Under Output, Color Conversion: Convert to Destination (Preserve Numbers), and set Destination to the printer's profile.
- Affinity Publisher, Designer or Photo: File › Export, PDF, choose a PDF/X preset, and under More set the colour space to CMYK and the profile to the printer's.
- Photoshop, for one image: Edit › Convert to Profile, the printer's profile as destination, Relative Colorimetric, Use Black Point Compensation. View › Proof Colors and View › Gamut Warning show the problem colours first.
- Scribus (free, macOS, Windows, Linux): File › Export › Save as PDF, with a PDF/X output and the printer's profile as the output intent.
One colour, such as a brand colour
For a single value to type into a design app, LittleCMS's transicc
(apt install liblcms2-utils) converts through the same profile:
echo "0 102 255" | transicc -t1 -b -o FOGRA39L_coated.icc
C=84.3107 M=52.8542 Y=0.0000 K=0.0000
It also prints a two-line banner. How to check whether a colour fits, and what to do when it doesn't, is in how to match a Pantone colour in CMYK.
With no design software
On a Chromebook, a locked-down work laptop or a tablet, there may be nothing to run a command in and no design app to export from. The printer still wants a CMYK PDF.
Designing is free and needs no account; exporting the print PDF needs a paid plan. Its output profiles are GRACoL 2013 (the default), SWOP 2013 and GRACoL 2006. It doesn't ship FOGRA39, so if a European printer names that profile, ask them whether a GRACoL file will do. Popcorn's own walkthrough of colour mode and the gamut warning is RGB vs CMYK.
Before you send it
- You asked the printer: CMYK from you with their profile, or PDF/X-4 and they convert.
- Images report
CMYKand the right profile inmagick identify, andpdfimages -listshowscmykfor every image in the PDF. - You looked at a soft proof, and every colour that matters still looks right.
- Body text is black ink only, not four-colour black.
- You kept the RGB original. Converting is one way.
Bleed, crop marks and image resolution are the other half of the job: how to make a print-ready PDF, how to add bleed and crop marks and how to check an image is sharp enough to print.