( imgtype imagetype.Type, quality int, o *options.Options, )
| 334 | } |
| 335 | |
| 336 | func (img *Image) Save( |
| 337 | imgtype imagetype.Type, |
| 338 | quality int, |
| 339 | o *options.Options, |
| 340 | ) (imagedata.ImageData, error) { |
| 341 | target := C.vips_target_new_to_memory() |
| 342 | |
| 343 | cancel := func() { |
| 344 | C.vips_unref_target(target) |
| 345 | } |
| 346 | |
| 347 | so := newSaveOptions(o) |
| 348 | |
| 349 | err := C.int(0) //nolint:wastedassign |
| 350 | imgsize := C.size_t(0) |
| 351 | |
| 352 | switch imgtype { |
| 353 | case imagetype.JPEG: |
| 354 | err = C.vips_jpegsave_go(img.VipsImage, target, C.int(quality), so) |
| 355 | case imagetype.JXL: |
| 356 | err = C.vips_jxlsave_go(img.VipsImage, target, C.int(quality), so) |
| 357 | case imagetype.PNG: |
| 358 | err = C.vips_pngsave_go(img.VipsImage, target, so) |
| 359 | case imagetype.WEBP: |
| 360 | err = C.vips_webpsave_go(img.VipsImage, target, C.int(quality), so) |
| 361 | case imagetype.GIF: |
| 362 | err = C.vips_gifsave_go(img.VipsImage, target, so) |
| 363 | case imagetype.HEIC: |
| 364 | err = C.vips_heifsave_go(img.VipsImage, target, C.int(quality), so) |
| 365 | case imagetype.AVIF: |
| 366 | err = C.vips_avifsave_go(img.VipsImage, target, C.int(quality), so) |
| 367 | case imagetype.TIFF: |
| 368 | err = C.vips_tiffsave_go(img.VipsImage, target, C.int(quality), so) |
| 369 | case imagetype.BMP: |
| 370 | err = C.vips_bmpsave_target_go(img.VipsImage, target, so) |
| 371 | case imagetype.ICO: |
| 372 | err = C.vips_icosave_target_go(img.VipsImage, target, so) |
| 373 | default: |
| 374 | // NOTE: probably, it would be better to use defer unref + additionally ref the target |
| 375 | // before passing it to the imagedata.ImageData |
| 376 | cancel() |
| 377 | return nil, newVipsError("Usupported image type to save") |
| 378 | } |
| 379 | if err != 0 { |
| 380 | cancel() |
| 381 | return nil, Error() |
| 382 | } |
| 383 | |
| 384 | var ptr = C.vips_blob_get(target.blob, &imgsize) |
| 385 | |
| 386 | b := unsafe.Slice((*byte)(ptr), int(imgsize)) |
| 387 | |
| 388 | i := imagedata.NewFromBytesWithFormat(imgtype, b) |
| 389 | i.AddCancel(cancel) |
| 390 | |
| 391 | return i, nil |
| 392 | } |
| 393 |
no test coverage detected