Browse Source

Resize images in linear colorspace

DarthSim 6 years ago
parent
commit
550b9edb20
2 changed files with 27 additions and 3 deletions
  1. 25 2
      process.go
  2. 2 1
      vips.c

+ 25 - 2
process.go

@@ -318,8 +318,12 @@ func transformImage(ctx context.Context, img **C.VipsImage, data []byte, po *pro
 		return err
 	}
 
-	if err = vipsFixColourspace(img); err != nil {
-		return err
+	convertToLinear := scale != 1 || po.Dpr != 1
+
+	if convertToLinear {
+		if err = vipsLinearColourspace(img); err != nil {
+			return err
+		}
 	}
 
 	if scale != 1 {
@@ -405,6 +409,12 @@ func transformImage(ctx context.Context, img **C.VipsImage, data []byte, po *pro
 		}
 	}
 
+	if convertToLinear {
+		if err = vipsFixColourspace(img); err != nil {
+			return err
+		}
+	}
+
 	if po.Expand && (po.Width > int((*img).Xsize) || po.Height > int((*img).Ysize)) {
 		if err = vipsEnsureAlpha(img); err != nil {
 			return err
@@ -874,6 +884,19 @@ func vipsImportColourProfile(img **C.VipsImage) error {
 	return nil
 }
 
+func vipsLinearColourspace(img **C.VipsImage) error {
+	var tmp *C.VipsImage
+
+	if C.vips_image_guess_interpretation(*img) != C.VIPS_INTERPRETATION_scRGB {
+		if C.vips_colourspace_go(*img, &tmp, C.VIPS_INTERPRETATION_scRGB) != 0 {
+			return vipsError()
+		}
+		C.swap_and_clear(img, tmp)
+	}
+
+	return nil
+}
+
 func vipsFixColourspace(img **C.VipsImage) error {
 	var tmp *C.VipsImage
 

+ 2 - 1
vips.c

@@ -240,7 +240,8 @@ vips_resize_with_premultiply(VipsImage *in, VipsImage **out, double scale) {
 
 int
 vips_need_icc_import(VipsImage *in) {
-  return in->Type == VIPS_INTERPRETATION_CMYK &&
+  return (vips_image_get_typeof(in, VIPS_META_ICC_NAME) ||
+    in->Type == VIPS_INTERPRETATION_CMYK) &&
 		in->Coding == VIPS_CODING_NONE &&
 		(in->BandFmt == VIPS_FORMAT_UCHAR ||
 		 in->BandFmt == VIPS_FORMAT_USHORT);