diff --git a/README.md b/README.md index baedf0f..2473f61 100644 --- a/README.md +++ b/README.md @@ -35,8 +35,10 @@ The [install script](https://github.com/lovell/sharp/blob/master/preinstall.sh) - Crop - Enlarge - Zoom -- Extract -- Image metadata +- Rotate by degrees +- Flip/Flop +- Extract area +- Extract image metadata - Image conversion to multiple formats ## API diff --git a/image.go b/image.go index 0a4fc3f..4344312 100644 --- a/image.go +++ b/image.go @@ -64,6 +64,14 @@ func (i *Image) Type() string { return DetermineImageTypeName(i.buffer) } +func (i *Image) Metadata() (ImageMetadata, error) { + return Metadata(i.buffer) +} + +func (i *Image) Size() (ImageSize, error) { + return Size(i.buffer) +} + func NewImage(buf []byte) *Image { return &Image{buf} } diff --git a/image_test.go b/image_test.go index 132faea..fa1fd02 100644 --- a/image_test.go +++ b/image_test.go @@ -16,7 +16,7 @@ func TestImageResize(t *testing.T) { func TestImageCrop(t *testing.T) { image := readImage() - _, err := image.Crop(300, 240) + _, err := image.Crop(800, 600) if err != nil { t.Errorf("Cannot process the image: %#v", err) } diff --git a/metadata.go b/metadata.go new file mode 100644 index 0000000..08776ba --- /dev/null +++ b/metadata.go @@ -0,0 +1,55 @@ +package bimg + +/* +#cgo pkg-config: vips +#include "vips/vips.h" +*/ +import "C" + +import () + +type ImageSize struct { + Width int + Height int +} + +type ImageMetadata struct { + Orientation int + Alpha bool + Profile bool + Space int + Type string + Size ImageSize +} + +func Size(buf []byte) (ImageSize, error) { + metadata, err := Metadata(buf) + if err != nil { + return ImageSize{}, err + } + + return ImageSize{ + Width: int(metadata.Size.Width), + Height: int(metadata.Size.Height), + }, nil +} + +func Metadata(buf []byte) (ImageMetadata, error) { + defer C.vips_thread_shutdown() + + image, imageType, err := vipsRead(buf) + if err != nil { + return ImageMetadata{}, err + } + defer C.g_object_unref(C.gpointer(image)) + + metadata := ImageMetadata{ + Type: getImageTypeName(imageType), + Size: ImageSize{ + Width: int(image.Xsize), + Height: int(image.Ysize), + }, + } + + return metadata, nil +} diff --git a/options.go b/options.go index 1884fe9..c4f55f1 100644 --- a/options.go +++ b/options.go @@ -12,6 +12,12 @@ type Gravity int type Interpolator int +const ( + BICUBIC Interpolator = iota + BILINEAR + NOHALO +) + var interpolations = map[Interpolator]string{ BICUBIC: "bicubic", BILINEAR: "bilinear", diff --git a/resize.go b/resize.go index cbea3dd..58e6bbc 100644 --- a/resize.go +++ b/resize.go @@ -11,12 +11,6 @@ import ( "math" ) -const ( - BICUBIC Interpolator = iota - BILINEAR - NOHALO -) - const ( CENTRE Gravity = iota NORTH @@ -163,9 +157,10 @@ func Resize(buf []byte, o Options) ([]byte, error) { if affinedWidth != o.Width || affinedHeight != o.Height { if o.Crop { - left, top := calculateCrop(inWidth, inHeight, o.Width, o.Height, o.Gravity) + left, top := calculateCrop(affinedWidth, affinedHeight, o.Width, o.Height, o.Gravity) o.Width = int(math.Min(float64(inWidth), float64(o.Width))) o.Height = int(math.Min(float64(inHeight), float64(o.Height))) + debug("crop image to %dx%d to %dx%d", left, top, o.Width, o.Height) image, err = vipsExtract(image, left, top, o.Width, o.Height) if err != nil { return nil, err diff --git a/resize_test.go b/resize_test.go index 7c146c8..044f43c 100644 --- a/resize_test.go +++ b/resize_test.go @@ -35,7 +35,7 @@ func TestResize(t *testing.T) { } func TestConvert(t *testing.T) { - options := Options{Width: 640, Height: 480, Crop: false, Type: PNG} + options := Options{Width: 640, Height: 480, Crop: true, Type: PNG} img, err := os.Open("fixtures/test.jpg") if err != nil { t.Fatal(err) diff --git a/type.go b/type.go index a491b11..92cc560 100644 --- a/type.go +++ b/type.go @@ -16,23 +16,26 @@ func DetermineImageType(buf []byte) ImageType { } func DetermineImageTypeName(buf []byte) string { - imageCode := vipsImageType(buf) + return getImageTypeName(vipsImageType(buf)) +} + +func getImageTypeName(code ImageType) string { imageType := "unknown" switch { - case imageCode == JPEG: + case code == JPEG: imageType = "jpeg" break - case imageCode == WEBP: + case code == WEBP: imageType = "webp" break - case imageCode == PNG: + case code == PNG: imageType = "png" break - case imageCode == TIFF: + case code == TIFF: imageType = "tiff" break - case imageCode == MAGICK: + case code == MAGICK: imageType = "magick" break }