diff --git a/.gitignore b/.gitignore index 397a4d9..7f3d15e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ /bimg /bundle -bin \ No newline at end of file +bin +/*.jpg +/*.png +/*.webp diff --git a/fixtures/space.jpg b/fixtures/space.jpg deleted file mode 100644 index f17d2f1..0000000 Binary files a/fixtures/space.jpg and /dev/null differ diff --git a/fixtures/test.jpg b/fixtures/test.jpg index 9309106..f17d2f1 100644 Binary files a/fixtures/test.jpg and b/fixtures/test.jpg differ diff --git a/fixtures/test.png b/fixtures/test.png new file mode 100644 index 0000000..d2f0591 Binary files /dev/null and b/fixtures/test.png differ diff --git a/fixtures/test.webp b/fixtures/test.webp new file mode 100644 index 0000000..122741b Binary files /dev/null and b/fixtures/test.webp differ diff --git a/resize_test.go b/resize_test.go index 973aad3..124b394 100644 --- a/resize_test.go +++ b/resize_test.go @@ -8,7 +8,7 @@ import ( func TestResize(t *testing.T) { options := Options{Width: 800, Height: 600, Crop: false, Rotate: 270} - img, err := os.Open("fixtures/space.jpg") + img, err := os.Open("fixtures/test.jpg") if err != nil { t.Fatal(err) } @@ -24,11 +24,11 @@ func TestResize(t *testing.T) { t.Errorf("Resize(imgData, %#v) error: %#v", options, err) } - if DetermineType(newImg) != JPEG { + if DetermineImageType(newImg) != JPEG { t.Fatal("Image is not jpeg") } - err = ioutil.WriteFile("fixtures/test.jpg", newImg, 0644) + err = ioutil.WriteFile("result.jpg", newImg, 0644) if err != nil { t.Fatal("Cannot save the image") } diff --git a/type.go b/type.go index 9a9cbb8..c908df9 100644 --- a/type.go +++ b/type.go @@ -1,14 +1,39 @@ package bimg const ( - UNKNOWN = "unknown" - JPEG = "jpeg" - WEBP = "webp" - PNG = "png" - TIFF = "tiff" - MAGICK = "magick" + UNKNOWN = iota + JPEG + WEBP + PNG + TIFF + MAGICK ) -func DetermineType(buf []byte) string { +func DetermineImageType(buf []byte) int { return vipsImageType(buf) } + +func DetermineImageTypeName(buf []byte) string { + imageCode := vipsImageType(buf) + imageType := "unknown" + + switch { + case imageCode == JPEG: + imageType = "jpeg" + break + case imageCode == WEBP: + imageType = "webp" + break + case imageCode == PNG: + imageType = "png" + break + case imageCode == TIFF: + imageType = "png" + break + case imageCode == MAGICK: + imageType = "magick" + break + } + + return imageType +} diff --git a/vips.go b/vips.go index 4d2a99d..dd49339 100644 --- a/vips.go +++ b/vips.go @@ -62,8 +62,6 @@ func vipsRead(buf []byte) (*C.struct__VipsImage, error) { var image *C.struct__VipsImage imageType := vipsImageType(buf) - debug("Image format: %s", imageType) - if imageType == UNKNOWN { return nil, errors.New("Input buffer contains unsupported image format") } @@ -71,8 +69,10 @@ func vipsRead(buf []byte) (*C.struct__VipsImage, error) { // feed it length := C.size_t(len(buf)) imageBuf := unsafe.Pointer(&buf[0]) + imageTypeC := C.int(imageType) - err := C.vips_jpegload_buffer_seq(imageBuf, length, &image) + err := C.vips_init_image(imageBuf, length, imageTypeC, &image) + //err := C.vips_jpegload_buffer_seq(imageBuf, length, &image) if err != 0 { return nil, vipsError() } @@ -92,7 +92,7 @@ func vipsExtract(image *C.struct__VipsImage, left int, top int, width int, heigh return buf, nil } -func vipsImageType(buf []byte) string { +func vipsImageType(buf []byte) int { imageType := UNKNOWN length := C.size_t(len(buf)) diff --git a/vips.h b/vips.h index 1cffa24..0e38995 100644 --- a/vips.h +++ b/vips.h @@ -2,6 +2,24 @@ #include #include +enum types { + UNKNOWN = 0, + JPEG, + WEBP, + PNG, + TIFF, + MAGICK +}; + +/* +#define JPEG 0 +#define WEBP "WEBP" +#define PNG "PNG" +#define TIFF "TIFF" +#define MAGICK "MAGICK" +#define UNKNOWN "UNKNOWN" +*/ + int vips_affine_interpolator(VipsImage *in, VipsImage **out, double a, double b, double c, double d, VipsInterpolate *interpolator) { @@ -73,6 +91,27 @@ vips_rotate(VipsImage *in, VipsImage **buf, int angle) return vips_rot(in, buf, rotate, NULL); }; +int +vips_init_image(void *buf, size_t len, int imageType, VipsImage **out) { + int code = 1; + + if (imageType == JPEG) { + code = vips_jpegload_buffer(buf, len, out, "access", VIPS_ACCESS_SEQUENTIAL, NULL); + } else if (imageType == PNG) { + code = vips_pngload_buffer(buf, len, out, "access", VIPS_ACCESS_SEQUENTIAL, NULL); + } else if (imageType == WEBP) { + code = vips_webpload_buffer(buf, len, out, "access", VIPS_ACCESS_SEQUENTIAL, NULL); + } else if (imageType == TIFF) { + code = vips_tiffload_buffer(buf, len, out, "access", VIPS_ACCESS_SEQUENTIAL, NULL); +#if (VIPS_MAJOR_VERSION >= 8) + } else if (imageType == MAGICK) { + code = vips_magickload_buffer(buf, len, out, "access", VIPS_ACCESS_SEQUENTIAL, NULL); +#endif + } + + return code; +}; + int vips_embed_extend(VipsImage *in, VipsImage **out, int left, int top, int width, int height, int extend) {