Browse Source

Fallback to no profile while saving PNG if profile is invalid

DarthSim 6 years ago
parent
commit
bb4f4602c3
2 changed files with 10 additions and 3 deletions
  1. 4 1
      process.go
  2. 6 2
      vips.h

+ 4 - 1
process.go

@@ -626,7 +626,10 @@ func vipsSaveImage(img *C.struct__VipsImage, imgtype imageType, quality int) ([]
 	case imageTypeJPEG:
 		err = C.vips_jpegsave_go(img, &ptr, &imgsize, 1, C.int(quality), cConf.JpegProgressive)
 	case imageTypePNG:
-		err = C.vips_pngsave_go(img, &ptr, &imgsize, cConf.PngInterlaced)
+		if err = C.vips_pngsave_go(img, &ptr, &imgsize, cConf.PngInterlaced, 1); err != 0 {
+			warning("Failed to save PNG; Trying not to embed icc profile")
+			err = C.vips_pngsave_go(img, &ptr, &imgsize, cConf.PngInterlaced, 0)
+		}
 	case imageTypeWEBP:
 		err = C.vips_webpsave_go(img, &ptr, &imgsize, 1, C.int(quality))
 	case imageTypeGIF:

+ 6 - 2
vips.h

@@ -264,8 +264,12 @@ vips_jpegsave_go(VipsImage *in, void **buf, size_t *len, int strip, int quality,
 }
 
 int
-vips_pngsave_go(VipsImage *in, void **buf, size_t *len, int interlace) {
-  return vips_pngsave_buffer(in, buf, len, "filter", VIPS_FOREIGN_PNG_FILTER_NONE, "interlace", interlace, NULL);
+vips_pngsave_go(VipsImage *in, void **buf, size_t *len, int interlace, int embed_profile) {
+  if (embed_profile) {
+    return vips_pngsave_buffer(in, buf, len, "filter", VIPS_FOREIGN_PNG_FILTER_NONE, "interlace", interlace, NULL);
+  }
+
+  return vips_pngsave_buffer(in, buf, len, "profile", "none", "filter", VIPS_FOREIGN_PNG_FILTER_NONE, "interlace", interlace, NULL);
 }
 
 int