瀏覽代碼

Fix PNG quantization with vips 8.10+

DarthSim 4 年之前
父節點
當前提交
7e4ae9d0ce
共有 2 個文件被更改,包括 21 次插入3 次删除
  1. 20 2
      vips.c
  2. 1 1
      vips.go

+ 20 - 2
vips.c

@@ -1,5 +1,6 @@
 #include "vips.h"
 #include <string.h>
+#include <math.h>
 
 #define VIPS_SUPPORT_SMARTCROP \
   (VIPS_MAJOR_VERSION > 8 || (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 5))
@@ -43,6 +44,9 @@
 #define VIPS_SUPPORT_FIND_TRIM \
   (VIPS_MAJOR_VERSION > 8 || (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 6))
 
+#define VIPS_SUPPORT_PNG_BITDEPTH \
+  (VIPS_MAJOR_VERSION > 8 || (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 10))
+
 #define EXIF_ORIENTATION "exif-ifd0-Orientation"
 
 #if (VIPS_MAJOR_VERSION > 8 || (VIPS_MAJOR_VERSION == 8 && VIPS_MINOR_VERSION >= 8))
@@ -642,15 +646,29 @@ vips_jpegsave_go(VipsImage *in, void **buf, size_t *len, int quality, int interl
 
 int
 vips_pngsave_go(VipsImage *in, void **buf, size_t *len, int interlace, int quantize, int colors) {
+  if (!quantize)
+    return vips_pngsave_buffer(
+      in, buf, len,
+      "filter", VIPS_FOREIGN_PNG_FILTER_NONE,
+      "interlace", interlace,
+      NULL
+    );
+
+  int bitdepth = ceil(log2(colors));
+
   return vips_pngsave_buffer(
     in, buf, len,
     "filter", VIPS_FOREIGN_PNG_FILTER_NONE,
     "interlace", interlace,
-#if VIPS_SUPPORT_PNG_QUANTIZATION
+#if VIPS_SUPPORT_PNG_BITDEPTH
+    "palette", quantize,
+    "bitdepth", bitdepth,
+#elif VIPS_SUPPORT_PNG_QUANTIZATION // VIPS_SUPPORT_PNG_BITDEPTH
     "palette", quantize,
     "colours", colors,
 #endif // VIPS_SUPPORT_PNG_QUANTIZATION
-    NULL);
+    NULL
+  );
 }
 
 int

+ 1 - 1
vips.go

@@ -2,7 +2,7 @@ package main
 
 /*
 #cgo pkg-config: vips
-#cgo LDFLAGS: -s -w
+#cgo LDFLAGS: -s -w -lm
 #cgo CFLAGS: -O3
 #include "vips.h"
 */