diff --git a/src/qcam/dng_writer.cpp b/src/qcam/dng_writer.cpp
index cbd8bed3e6d02269..9435eeec5438f158 100644
--- a/src/qcam/dng_writer.cpp
+++ b/src/qcam/dng_writer.cpp
@@ -28,6 +28,7 @@ struct FormatInfo {
 	CFAPatternColour pattern[4];
 	void (*packScanline)(void *output, const void *input,
 			     unsigned int width);
+	unsigned int thumbDownscaleFactor;
 	void (*thumbScanline)(const FormatInfo &info, void *output,
 			      const void *input, unsigned int width,
 			      unsigned int stride);
@@ -87,48 +88,56 @@ static const std::map<PixelFormat, FormatInfo> formatInfo = {
 		.bitsPerSample = 10,
 		.pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed },
 		.packScanline = packScanlineSBGGR10P,
+		.thumbDownscaleFactor = 16,
 		.thumbScanline = thumbScanlineSBGGRxxP,
 	} },
 	{ PixelFormat(DRM_FORMAT_SGBRG10, MIPI_FORMAT_MOD_CSI2_PACKED), {
 		.bitsPerSample = 10,
 		.pattern = { CFAPatternGreen, CFAPatternBlue, CFAPatternRed, CFAPatternGreen },
 		.packScanline = packScanlineSBGGR10P,
+		.thumbDownscaleFactor = 16,
 		.thumbScanline = thumbScanlineSBGGRxxP,
 	} },
 	{ PixelFormat(DRM_FORMAT_SGRBG10, MIPI_FORMAT_MOD_CSI2_PACKED), {
 		.bitsPerSample = 10,
 		.pattern = { CFAPatternGreen, CFAPatternRed, CFAPatternBlue, CFAPatternGreen },
 		.packScanline = packScanlineSBGGR10P,
+		.thumbDownscaleFactor = 16,
 		.thumbScanline = thumbScanlineSBGGRxxP,
 	} },
 	{ PixelFormat(DRM_FORMAT_SRGGB10, MIPI_FORMAT_MOD_CSI2_PACKED), {
 		.bitsPerSample = 10,
 		.pattern = { CFAPatternRed, CFAPatternGreen, CFAPatternGreen, CFAPatternBlue },
 		.packScanline = packScanlineSBGGR10P,
+		.thumbDownscaleFactor = 16,
 		.thumbScanline = thumbScanlineSBGGRxxP,
 	} },
 	{ PixelFormat(DRM_FORMAT_SBGGR12, MIPI_FORMAT_MOD_CSI2_PACKED), {
 		.bitsPerSample = 12,
 		.pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed },
 		.packScanline = packScanlineSBGGR12P,
+		.thumbDownscaleFactor = 16,
 		.thumbScanline = thumbScanlineSBGGRxxP,
 	} },
 	{ PixelFormat(DRM_FORMAT_SGBRG12, MIPI_FORMAT_MOD_CSI2_PACKED), {
 		.bitsPerSample = 12,
 		.pattern = { CFAPatternGreen, CFAPatternBlue, CFAPatternRed, CFAPatternGreen },
 		.packScanline = packScanlineSBGGR12P,
+		.thumbDownscaleFactor = 16,
 		.thumbScanline = thumbScanlineSBGGRxxP,
 	} },
 	{ PixelFormat(DRM_FORMAT_SGRBG12, MIPI_FORMAT_MOD_CSI2_PACKED), {
 		.bitsPerSample = 12,
 		.pattern = { CFAPatternGreen, CFAPatternRed, CFAPatternBlue, CFAPatternGreen },
 		.packScanline = packScanlineSBGGR12P,
+		.thumbDownscaleFactor = 16,
 		.thumbScanline = thumbScanlineSBGGRxxP,
 	} },
 	{ PixelFormat(DRM_FORMAT_SRGGB12, MIPI_FORMAT_MOD_CSI2_PACKED), {
 		.bitsPerSample = 12,
 		.pattern = { CFAPatternRed, CFAPatternGreen, CFAPatternGreen, CFAPatternBlue },
 		.packScanline = packScanlineSBGGR12P,
+		.thumbDownscaleFactor = 16,
 		.thumbScanline = thumbScanlineSBGGRxxP,
 	} },
 };
@@ -178,13 +187,14 @@ int DNGWriter::write(const char *filename, const Camera *camera,
 	TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
 
 	/*
-	 * Thumbnail-specific tags. The thumbnail is stored as an RGB image
-	 * with 1/16 of the raw image resolution. Greyscale would save space,
-	 * but doesn't seem well supported by RawTherapee.
+	 * Thumbnail-specific tags. The thumbnail is stored as an RGB image with
+	 * format dependet downscaling of the raw image resolution. Greyscale
+	 * would save space, but doesn't seem well supported by RawTherapee.
 	 */
+	const unsigned int thumbScale = info->thumbDownscaleFactor;
 	TIFFSetField(tif, TIFFTAG_SUBFILETYPE, FILETYPE_REDUCEDIMAGE);
-	TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, config.size.width / 16);
-	TIFFSetField(tif, TIFFTAG_IMAGELENGTH, config.size.height / 16);
+	TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, config.size.width / thumbScale);
+	TIFFSetField(tif, TIFFTAG_IMAGELENGTH, config.size.height / thumbScale);
 	TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
 	TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
 	TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
@@ -202,9 +212,10 @@ int DNGWriter::write(const char *filename, const Camera *camera,
 
 	/* Write the thumbnail. */
 	const uint8_t *row = static_cast<const uint8_t *>(data);
-	for (unsigned int y = 0; y < config.size.height / 16; y++) {
+	for (unsigned int y = 0; y < config.size.height / thumbScale; y++) {
 		info->thumbScanline(*info, &scanline, row,
-				    config.size.width / 16, config.stride);
+				    config.size.width / thumbScale,
+				    config.stride);
 
 		if (TIFFWriteScanline(tif, &scanline, y, 0) != 1) {
 			std::cerr << "Failed to write thumbnail scanline"
@@ -213,7 +224,7 @@ int DNGWriter::write(const char *filename, const Camera *camera,
 			return -EINVAL;
 		}
 
-		row += config.stride * 16;
+		row += config.stride * thumbScale;
 	}
 
 	TIFFWriteDirectory(tif);
