fix: possible leaks

master
Tomas Aparicio 11 years ago
parent 7b82104e1d
commit 6cb3717518

@ -3,16 +3,13 @@
Small but featured Go library for blazing fast image processing based on [libvips](https://github.com/jcupitt/libvips) using C bindings. Small but featured Go library for blazing fast image processing based on [libvips](https://github.com/jcupitt/libvips) using C bindings.
bimg is designed to be a small and efficient library with a specific but useful and generic set of features. bimg is designed to be a small and efficient library with a specific but useful and generic set of features.
It uses internally libvips, which is typically 4x faster than using the quickest ImageMagick and GraphicsMagick settings or Go native `image` package, and in some cases it's even 8x faster processing JPEG images. It uses internally libvips, which is typically 4x faster than using the quickest ImageMagick and GraphicsMagick settings or Go native `image` package, and in some cases it's even 8x faster processing JPEG images. It can read JPEG, PNG, WEBP, TIFF and Magick formats and it can output to JPEG, PNG and WEBP. It supports common [image transformation](#supported-image-operations) operations such as crop, resize, rotate... and conversion into multiple formats.
bimg can read JPEG, PNG, WEBP, TIFF and Magick formats and it can output to JPEG, PNG and WEBP.
It supports common [image transformation](#supported-image-operations) operations such as crop, resize, rotate... and conversion into multiple formats.
To getting start take a look to the [examples](#examples) and [programmatic API](https://godoc.org/github.com/h2non/bimg) documentation. To getting start take a look to the [examples](#examples) and [programmatic API](https://godoc.org/github.com/h2non/bimg) documentation.
bimg was heavily inspired in [sharp](https://github.com/lovell/sharp), a great node.js package for image processing build by [Lovell Fuller](https://github.com/lovell). bimg was heavily inspired in [sharp](https://github.com/lovell/sharp), a great node.js package for image processing build by [Lovell Fuller](https://github.com/lovell).
**Note**: bimg is still a beta package. Pull requests and issues are highly appreciated **Note**: bimg is still beta. Pull requests and issues are highly appreciated
## Prerequisites ## Prerequisites
@ -43,8 +40,8 @@ The [install script](https://github.com/lovell/sharp/blob/master/preinstall.sh)
- Rotate - Rotate
- Flip - Flip
- Extract area - Extract area
- EXIF metadata (size, alpha channel, profile, orientation...)
- Format conversion - Format conversion
- EXIF metadata (size, alpha channel, profile, orientation...)
## Performance ## Performance

@ -62,7 +62,7 @@ func Resize(buf []byte, o Options) ([]byte, error) {
// Try to use libjpeg shrink-on-load // Try to use libjpeg shrink-on-load
if imageType == JPEG && shrink >= 2 { if imageType == JPEG && shrink >= 2 {
tmpImage, factor, err := shrinkJpegImage(buf, factor, shrink) tmpImage, factor, err := shrinkJpegImage(buf, image, factor, shrink)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -197,7 +197,7 @@ func shrinkImage(image *C.struct__VipsImage, o Options, residual float64, shrink
return image, residual, nil return image, residual, nil
} }
func shrinkJpegImage(buf []byte, factor float64, shrink int) (*C.struct__VipsImage, float64, error) { func shrinkJpegImage(buf []byte, input *C.struct__VipsImage, factor float64, shrink int) (*C.struct__VipsImage, float64, error) {
var image *C.struct__VipsImage var image *C.struct__VipsImage
var err error var err error
shrinkOnLoad := 1 shrinkOnLoad := 1
@ -217,7 +217,7 @@ func shrinkJpegImage(buf []byte, factor float64, shrink int) (*C.struct__VipsIma
// Reload input using shrink-on-load // Reload input using shrink-on-load
if shrinkOnLoad > 1 { if shrinkOnLoad > 1 {
image, err = vipsShrinkJpeg(buf, shrinkOnLoad) image, err = vipsShrinkJpeg(buf, input, shrinkOnLoad)
} }
return image, factor, err return image, factor, err

@ -59,9 +59,9 @@ func Shutdown() {
func vipsRotate(image *C.struct__VipsImage, angle Angle) (*C.struct__VipsImage, error) { func vipsRotate(image *C.struct__VipsImage, angle Angle) (*C.struct__VipsImage, error) {
var out *C.struct__VipsImage var out *C.struct__VipsImage
defer C.g_object_unref(C.gpointer(image))
err := C.vips_rotate(image, &out, C.int(angle)) err := C.vips_rotate(image, &out, C.int(angle))
C.g_object_unref(C.gpointer(image))
if err != 0 { if err != 0 {
return nil, catchVipsError() return nil, catchVipsError()
} }
@ -72,9 +72,9 @@ func vipsRotate(image *C.struct__VipsImage, angle Angle) (*C.struct__VipsImage,
func vipsFlip(image *C.struct__VipsImage, direction Direction) (*C.struct__VipsImage, error) { func vipsFlip(image *C.struct__VipsImage, direction Direction) (*C.struct__VipsImage, error) {
var out *C.struct__VipsImage var out *C.struct__VipsImage
defer C.g_object_unref(C.gpointer(image))
err := C.vips_flip_bridge(image, &out, C.int(direction)) err := C.vips_flip_bridge(image, &out, C.int(direction))
C.g_object_unref(C.gpointer(image))
if err != 0 { if err != 0 {
return nil, catchVipsError() return nil, catchVipsError()
} }
@ -106,9 +106,9 @@ func vipsRead(buf []byte) (*C.struct__VipsImage, ImageType, error) {
func vipsExtract(image *C.struct__VipsImage, left, top, width, height int) (*C.struct__VipsImage, error) { func vipsExtract(image *C.struct__VipsImage, left, top, width, height int) (*C.struct__VipsImage, error) {
var buf *C.struct__VipsImage var buf *C.struct__VipsImage
defer C.g_object_unref(C.gpointer(image))
err := C.vips_extract_area_bridge(image, &buf, C.int(left), C.int(top), C.int(width), C.int(height)) err := C.vips_extract_area_bridge(image, &buf, C.int(left), C.int(top), C.int(width), C.int(height))
C.g_object_unref(C.gpointer(image))
if err != 0 { if err != 0 {
return nil, catchVipsError() return nil, catchVipsError()
} }
@ -116,11 +116,11 @@ func vipsExtract(image *C.struct__VipsImage, left, top, width, height int) (*C.s
return buf, nil return buf, nil
} }
func vipsShrinkJpeg(buf []byte, shrink int) (*C.struct__VipsImage, error) { func vipsShrinkJpeg(buf []byte, input *C.struct__VipsImage, shrink int) (*C.struct__VipsImage, error) {
var image *C.struct__VipsImage var image *C.struct__VipsImage
defer C.g_object_unref(C.gpointer(input))
err := C.vips_jpegload_buffer_shrink(unsafe.Pointer(&buf[0]), C.size_t(len(buf)), &image, C.int(shrink)) err := C.vips_jpegload_buffer_shrink(unsafe.Pointer(&buf[0]), C.size_t(len(buf)), &image, C.int(shrink))
C.g_object_unref(C.gpointer(image))
if err != 0 { if err != 0 {
return nil, catchVipsError() return nil, catchVipsError()
} }
@ -130,9 +130,9 @@ func vipsShrinkJpeg(buf []byte, shrink int) (*C.struct__VipsImage, error) {
func vipsShrink(input *C.struct__VipsImage, shrink int) (*C.struct__VipsImage, error) { func vipsShrink(input *C.struct__VipsImage, shrink int) (*C.struct__VipsImage, error) {
var image *C.struct__VipsImage var image *C.struct__VipsImage
defer C.g_object_unref(C.gpointer(input))
err := C.vips_shrink_0(input, &image, C.double(float64(shrink)), C.double(float64(shrink))) err := C.vips_shrink_0(input, &image, C.double(float64(shrink)), C.double(float64(shrink)))
C.g_object_unref(C.gpointer(image))
if err != 0 { if err != 0 {
return nil, catchVipsError() return nil, catchVipsError()
} }
@ -142,9 +142,9 @@ func vipsShrink(input *C.struct__VipsImage, shrink int) (*C.struct__VipsImage, e
func vipsEmbed(input *C.struct__VipsImage, left, top, width, height, extend int) (*C.struct__VipsImage, error) { func vipsEmbed(input *C.struct__VipsImage, left, top, width, height, extend int) (*C.struct__VipsImage, error) {
var image *C.struct__VipsImage var image *C.struct__VipsImage
defer C.g_object_unref(C.gpointer(input))
err := C.vips_embed_bridge(input, &image, C.int(left), C.int(top), C.int(width), C.int(height), C.int(extend)) err := C.vips_embed_bridge(input, &image, C.int(left), C.int(top), C.int(width), C.int(height), C.int(extend))
C.g_object_unref(C.gpointer(image))
if err != 0 { if err != 0 {
return nil, catchVipsError() return nil, catchVipsError()
} }
@ -158,10 +158,11 @@ func vipsAffine(input *C.struct__VipsImage, residual float64, i Interpolator) (*
istring := C.CString(i.String()) istring := C.CString(i.String())
interpolator := C.vips_interpolate_new(istring) interpolator := C.vips_interpolate_new(istring)
defer C.g_object_unref(C.gpointer(input))
defer C.free(unsafe.Pointer(istring))
// Perform affine transformation // Perform affine transformation
err := C.vips_affine_interpolator(input, &image, C.double(residual), 0, 0, C.double(residual), interpolator) err := C.vips_affine_interpolator(input, &image, C.double(residual), 0, 0, C.double(residual), interpolator)
C.g_object_unref(C.gpointer(image))
C.free(unsafe.Pointer(istring))
if err != 0 { if err != 0 {
return nil, catchVipsError() return nil, catchVipsError()
} }

Loading…
Cancel
Save