diff --git a/odoo/addons/base/tests/test_image.py b/odoo/addons/base/tests/test_image.py
index 32ff385abd0477858763374850b6eb241c5ea04a..c5d55b4eee47c0608d6950b9d02a5d239b74135d 100644
--- a/odoo/addons/base/tests/test_image.py
+++ b/odoo/addons/base/tests/test_image.py
@@ -314,3 +314,9 @@ class TestImage(TransactionCase):
         self._assertAlmostEqualSequence(fixed_image.getpixel((size - 1, 0)), expected[1])         # top/right
         self._assertAlmostEqualSequence(fixed_image.getpixel((0, size - 1)), expected[2])         # bottom/left
         self._assertAlmostEqualSequence(fixed_image.getpixel((size - 1, size - 1)), expected[3])  # bottom/right
+
+    def test_ptype_image_to_jpeg(self):
+        """converts to RGB when saving as JPEG"""
+        image1 = Image.new('P', (1, 1), color='red')
+        image2 = Image.new('RGB', (1, 1), color='red')
+        self.assertEqual(tools.image.image_apply_opt(image1, 'JPEG'), tools.image.image_apply_opt(image2, 'JPEG'))
diff --git a/odoo/tools/image.py b/odoo/tools/image.py
index 4e112ac438afc395541c8d035fab3fe5cea0060c..18380d1202d073a3fb5c515a1f4ff72a76defc3b 100644
--- a/odoo/tools/image.py
+++ b/odoo/tools/image.py
@@ -460,6 +460,8 @@ def image_apply_opt(image, format, **params):
     :return: the image formatted
     :rtype: bytes
     """
+    if format == 'JPEG' and image.mode not in ['1', 'L', 'RGB']:
+        image = image.convert("RGB")
     stream = io.BytesIO()
     image.save(stream, format=format, **params)
     return stream.getvalue()