[Bf-blender-cvs] [6f88053d852] blender-v2.92-release: Fix T84661: read jpg pixel density

Philipp Oeser noreply at git.blender.org
Fri Jan 29 11:37:47 CET 2021


Commit: 6f88053d852ad7f04b3d67b1905d88917f481ee3
Author: Philipp Oeser
Date:   Thu Jan 21 16:13:30 2021 +0100
Branches: blender-v2.92-release
https://developer.blender.org/rB6f88053d852ad7f04b3d67b1905d88917f481ee3

Fix T84661: read jpg pixel density

For jpeg, an image.resolution was always based on the default 72dpi, now
read the pixel density from the jpeg_decompress_struct, convert
according to unit and store in IMBuf's ppm.

Not 100% sure of all implications tbh., files I have checked seem to work
as expected now in the context of the report.

Maniphest Tasks: T84661

Differential Revision: https://developer.blender.org/D10166

===================================================================

M	source/blender/imbuf/intern/jpeg.c

===================================================================

diff --git a/source/blender/imbuf/intern/jpeg.c b/source/blender/imbuf/intern/jpeg.c
index 7d4797def8f..440375f60dc 100644
--- a/source/blender/imbuf/intern/jpeg.c
+++ b/source/blender/imbuf/intern/jpeg.c
@@ -413,11 +413,22 @@ static ImBuf *ibJpegImageFromCinfo(struct jpeg_decompress_struct *cinfo, int fla
       jpeg_finish_decompress(cinfo);
     }
 
-    jpeg_destroy((j_common_ptr)cinfo);
     if (ibuf) {
+      /* Density_unit may be 0 for unknown, 1 for dots/inch, or 2 for dots/cm. */
+      if (cinfo->density_unit == 1) {
+        /* Convert inches to meters. */
+        ibuf->ppm[0] = cinfo->X_density / 0.0254f;
+        ibuf->ppm[1] = cinfo->Y_density / 0.0254f;
+      }
+      else if (cinfo->density_unit == 2) {
+        ibuf->ppm[0] = cinfo->X_density * 100.0f;
+        ibuf->ppm[1] = cinfo->Y_density * 100.0f;
+      }
+
       ibuf->ftype = IMB_FTYPE_JPG;
       ibuf->foptions.quality = MIN2(ibuf_quality, 100);
     }
+    jpeg_destroy((j_common_ptr)cinfo);
   }
 
   return ibuf;



More information about the Bf-blender-cvs mailing list