@@ -7,7 +7,6 @@ import "C"
77
88import (
99 "errors"
10- "reflect"
1110 "runtime"
1211 "unsafe"
1312)
@@ -18,7 +17,8 @@ type Error struct {
1817}
1918
2019type Image struct {
21- img * C.Exiv2Image
20+ bytesArrayPtr unsafe.Pointer
21+ img * C.Exiv2Image
2222}
2323
2424type MetadataProvider interface {
@@ -42,13 +42,18 @@ func makeError(cerr *C.Exiv2Error) *Error {
4242 }
4343}
4444
45- func makeImage (cimg * C.Exiv2Image ) * Image {
45+ func makeImage (cimg * C.Exiv2Image , bytesPtr unsafe. Pointer ) * Image {
4646 img := & Image {
47- cimg ,
47+ bytesArrayPtr : bytesPtr ,
48+ img : cimg ,
4849 }
4950
5051 runtime .SetFinalizer (img , func (x * Image ) {
5152 C .exiv2_image_free (x .img )
53+
54+ if x .bytesArrayPtr != nil {
55+ C .free (x .bytesArrayPtr )
56+ }
5257 })
5358
5459 return img
@@ -71,26 +76,33 @@ func Open(path string) (*Image, error) {
7176 return nil , err
7277 }
7378
74- return makeImage (cimg ), nil
79+ return makeImage (cimg , nil ), nil
7580}
7681
7782// OpenBytes opens a byte slice with image data and returns a pointer to
7883// the corresponding Image object, but does not read the Metadata.
7984// Start the parsing with a call to ReadMetadata()
80- func OpenBytes (b []byte ) (* Image , error ) {
81- if len (b ) == 0 {
85+ func OpenBytes (input []byte ) (* Image , error ) {
86+ if len (input ) == 0 {
8287 return nil , & Error {0 , "input is empty" }
8388 }
89+
8490 var cerr * C.Exiv2Error
85- cimg := C .exiv2_image_factory_open_bytes ((* C .uchar )(unsafe .Pointer (& b [0 ])), C .long (len (b )), & cerr )
91+
92+ bytesArrayPtr := C .CBytes (input )
93+ cimg := C .exiv2_image_factory_open_bytes (
94+ (* C .uchar )(bytesArrayPtr ),
95+ C .long (len (input )),
96+ & cerr ,
97+ )
8698
8799 if cerr != nil {
88100 err := makeError (cerr )
89101 C .exiv2_error_free (cerr )
90102 return nil , err
91103 }
92104
93- return makeImage (cimg ), nil
105+ return makeImage (cimg , bytesArrayPtr ), nil
94106}
95107
96108// ReadMetadata reads the metadata of an Image
@@ -111,19 +123,10 @@ func (i *Image) ReadMetadata() error {
111123// Returns an image contents.
112124// If its metadata has been changed, the changes are reflected here.
113125func (i * Image ) GetBytes () []byte {
114- size := int ( C .exiv_image_get_size (i .img ) )
126+ size := C .exiv_image_get_size (i .img )
115127 ptr := C .exiv_image_get_bytes_ptr (i .img )
116128
117- var slice []byte
118- header := (* reflect .SliceHeader )(unsafe .Pointer (& slice ))
119- header .Cap = size
120- header .Len = size
121- header .Data = uintptr (unsafe .Pointer (ptr ))
122-
123- target := make ([]byte , len (slice ))
124- copy (target , slice )
125-
126- return target
129+ return C .GoBytes (unsafe .Pointer (ptr ), C .int (size ))
127130}
128131
129132// PixelWidth returns the width of the image in pixels
0 commit comments