feat(#189): allow strip image metadata via bimg.Options.StripMetadata = bool
Before Width: | Height: | Size: 198 KiB After Width: | Height: | Size: 198 KiB |
Before Width: | Height: | Size: 199 KiB After Width: | Height: | Size: 199 KiB |
Before Width: | Height: | Size: 199 KiB After Width: | Height: | Size: 200 KiB |
Before Width: | Height: | Size: 198 KiB After Width: | Height: | Size: 199 KiB |
Before Width: | Height: | Size: 204 KiB After Width: | Height: | Size: 205 KiB |
Before Width: | Height: | Size: 204 KiB After Width: | Height: | Size: 205 KiB |
Before Width: | Height: | Size: 203 KiB After Width: | Height: | Size: 204 KiB |
Before Width: | Height: | Size: 204 KiB After Width: | Height: | Size: 205 KiB |
Before Width: | Height: | Size: 164 KiB After Width: | Height: | Size: 165 KiB |
Before Width: | Height: | Size: 165 KiB After Width: | Height: | Size: 166 KiB |
Before Width: | Height: | Size: 165 KiB After Width: | Height: | Size: 166 KiB |
Before Width: | Height: | Size: 165 KiB After Width: | Height: | Size: 165 KiB |
Before Width: | Height: | Size: 173 KiB After Width: | Height: | Size: 174 KiB |
Before Width: | Height: | Size: 174 KiB After Width: | Height: | Size: 174 KiB |
Before Width: | Height: | Size: 173 KiB After Width: | Height: | Size: 173 KiB |
Before Width: | Height: | Size: 174 KiB After Width: | Height: | Size: 174 KiB |
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 111 KiB |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 117 KiB |
|
@ -204,6 +204,7 @@ type Options struct {
|
|||
NoAutoRotate bool
|
||||
NoProfile bool
|
||||
Interlace bool
|
||||
StripMetadata bool
|
||||
Extend Extend
|
||||
Rotate Angle
|
||||
Background Color
|
||||
|
|
|
@ -161,6 +161,7 @@ func saveImage(image *C.VipsImage, o Options) ([]byte, error) {
|
|||
NoProfile: o.NoProfile,
|
||||
Interpretation: o.Interpretation,
|
||||
OutputICC: o.OutputICC,
|
||||
StripMetadata: o.StripMetadata,
|
||||
}
|
||||
// Finally get the resultant buffer
|
||||
return vipsSave(image, saveOptions)
|
||||
|
|
8
vips.go
|
@ -55,6 +55,7 @@ type vipsSaveOptions struct {
|
|||
Type ImageType
|
||||
Interlace bool
|
||||
NoProfile bool
|
||||
StripMetadata bool
|
||||
OutputICC string // Absolute path to the output ICC profile
|
||||
Interpretation Interpretation
|
||||
}
|
||||
|
@ -420,6 +421,7 @@ func vipsSave(image *C.VipsImage, o vipsSaveOptions) ([]byte, error) {
|
|||
saveErr := C.int(0)
|
||||
interlace := C.int(boolToInt(o.Interlace))
|
||||
quality := C.int(o.Quality)
|
||||
strip := C.int(boolToInt(o.Interlace))
|
||||
|
||||
if o.Type != 0 && !IsTypeSupportedSave(o.Type) {
|
||||
return nil, fmt.Errorf("VIPS cannot save to %#v", ImageTypes[o.Type])
|
||||
|
@ -427,13 +429,13 @@ func vipsSave(image *C.VipsImage, o vipsSaveOptions) ([]byte, error) {
|
|||
var ptr unsafe.Pointer
|
||||
switch o.Type {
|
||||
case WEBP:
|
||||
saveErr = C.vips_webpsave_bridge(tmpImage, &ptr, &length, 1, quality)
|
||||
saveErr = C.vips_webpsave_bridge(tmpImage, &ptr, &length, strip, quality)
|
||||
case PNG:
|
||||
saveErr = C.vips_pngsave_bridge(tmpImage, &ptr, &length, 1, C.int(o.Compression), quality, interlace)
|
||||
saveErr = C.vips_pngsave_bridge(tmpImage, &ptr, &length, strip, C.int(o.Compression), quality, interlace)
|
||||
case TIFF:
|
||||
saveErr = C.vips_tiffsave_bridge(tmpImage, &ptr, &length)
|
||||
default:
|
||||
saveErr = C.vips_jpegsave_bridge(tmpImage, &ptr, &length, 1, quality, interlace)
|
||||
saveErr = C.vips_jpegsave_bridge(tmpImage, &ptr, &length, strip, quality, interlace)
|
||||
}
|
||||
|
||||
if int(saveErr) != 0 {
|
||||
|
|
8
vips.h
|
@ -269,7 +269,7 @@ vips_icc_transform_bridge (VipsImage *in, VipsImage **out, const char *output_ic
|
|||
int
|
||||
vips_jpegsave_bridge(VipsImage *in, void **buf, size_t *len, int strip, int quality, int interlace) {
|
||||
return vips_jpegsave_buffer(in, buf, len,
|
||||
"strip", strip,
|
||||
"strip", strip == 1 ? TRUE : FALSE,
|
||||
"Q", quality,
|
||||
"optimize_coding", TRUE,
|
||||
"interlace", with_interlace(interlace),
|
||||
|
@ -281,7 +281,7 @@ int
|
|||
vips_pngsave_bridge(VipsImage *in, void **buf, size_t *len, int strip, int compression, int quality, int interlace) {
|
||||
#if (VIPS_MAJOR_VERSION >= 8 || (VIPS_MAJOR_VERSION >= 7 && VIPS_MINOR_VERSION >= 42))
|
||||
return vips_pngsave_buffer(in, buf, len,
|
||||
"strip", FALSE,
|
||||
"strip", strip == 1 ? TRUE : FALSE,
|
||||
"compression", compression,
|
||||
"interlace", with_interlace(interlace),
|
||||
"filter", VIPS_FOREIGN_PNG_FILTER_NONE,
|
||||
|
@ -289,7 +289,7 @@ vips_pngsave_bridge(VipsImage *in, void **buf, size_t *len, int strip, int compr
|
|||
);
|
||||
#else
|
||||
return vips_pngsave_buffer(in, buf, len,
|
||||
"strip", FALSE,
|
||||
"strip", strip == 1 ? TRUE : FALSE,
|
||||
"compression", compression,
|
||||
"interlace", with_interlace(interlace),
|
||||
NULL
|
||||
|
@ -300,7 +300,7 @@ vips_pngsave_bridge(VipsImage *in, void **buf, size_t *len, int strip, int compr
|
|||
int
|
||||
vips_webpsave_bridge(VipsImage *in, void **buf, size_t *len, int strip, int quality) {
|
||||
return vips_webpsave_buffer(in, buf, len,
|
||||
"strip", strip,
|
||||
"strip", strip == 1 ? TRUE : FALSE,
|
||||
"Q", quality,
|
||||
NULL
|
||||
);
|
||||
|
|
|
@ -33,7 +33,7 @@ func TestVipsSave(t *testing.T) {
|
|||
|
||||
for _, typ := range types {
|
||||
image, _, _ := vipsRead(readImage("test.jpg"))
|
||||
options := vipsSaveOptions{Quality: 95, Type: typ}
|
||||
options := vipsSaveOptions{Quality: 95, Type: typ, StripMetadata: true}
|
||||
|
||||
buf, err := vipsSave(image, options)
|
||||
if err != nil {
|
||||
|
|