From 8ce76f82d9eb1695d0c9a89091a3eaa3b8923065 Mon Sep 17 00:00:00 2001 From: Robert Swain Date: Wed, 7 Jun 2017 01:08:39 +0200 Subject: [PATCH] mediaapi: Elaborate on scaling libs in README --- .../matrix-org/dendrite/mediaapi/README.md | 20 +++++++++++++++++- .../dendrite/mediaapi/bimg-96x96-crop.jpg | Bin 0 -> 4223 bytes .../dendrite/mediaapi/nfnt-96x96-crop.jpg | Bin 0 -> 4896 bytes 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 src/github.com/matrix-org/dendrite/mediaapi/bimg-96x96-crop.jpg create mode 100644 src/github.com/matrix-org/dendrite/mediaapi/nfnt-96x96-crop.jpg diff --git a/src/github.com/matrix-org/dendrite/mediaapi/README.md b/src/github.com/matrix-org/dendrite/mediaapi/README.md index 8a32263bb..8d6cc6270 100644 --- a/src/github.com/matrix-org/dendrite/mediaapi/README.md +++ b/src/github.com/matrix-org/dendrite/mediaapi/README.md @@ -4,6 +4,24 @@ This server is responsible for serving `/media` requests as per: http://matrix.org/docs/spec/client_server/r0.2.0.html#id43 +## Scaling libraries + +### nfnt/resize (default) + Thumbnailing uses https://github.com/nfnt/resize by default which is a pure golang image scaling library relying on image codecs from the standard library. It is ISC-licensed. -Alternatively one can use `gb build -tags bimg` to use bimg from https://github.com/h2non/bimg (MIT-licensed) which uses libvips from https://github.com/jcupitt/libvips (LGPL v2.1+ -licensed). libvips is a C library and must be installed/built separately. See the github page for details. Also note that libvips in turn has dependencies with a selection of FOSS licenses. bimg and libvips have significantly better performance than nfnt/resize. +It is multi-threaded and uses Lanczos3 so produces sharp images. Using Lanczos3 all the way makes it slower than some other approaches like bimg. (~845ms in total for pre-generating 32x32-crop, 96x96-crop, 320x240-scale, 640x480-scale and 800x600-scale from a given JPEG image on a given machine.) + +See the sample below for image quality with nfnt/resize: + +![](nfnt-96x96-crop.jpg) + +### bimg (uses libvips C library) + +Alternatively one can use `gb build -tags bimg` to use bimg from https://github.com/h2non/bimg (MIT-licensed) which uses libvips from https://github.com/jcupitt/libvips (LGPL v2.1+ -licensed). libvips is a C library and must be installed/built separately. See the github page for details. Also note that libvips in turn has dependencies with a selection of FOSS licenses. + +bimg and libvips have significantly better performance than nfnt/resize but produce slightly less-sharp images. bimg uses a box filter for downscaling to within about 200% of the target scale and then uses Lanczos3 for the last bit. This is a much faster approach but comes at the expense of sharpness. (~295ms in total for pre-generating 32x32-crop, 96x96-crop, 320x240-scale, 640x480-scale and 800x600-scale from a given JPEG image on a given machine.) + +See the sample below for image quality with bimg: + +![](bimg-96x96-crop.jpg) diff --git a/src/github.com/matrix-org/dendrite/mediaapi/bimg-96x96-crop.jpg b/src/github.com/matrix-org/dendrite/mediaapi/bimg-96x96-crop.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f6521893a8686fe65f726a658e39f8ae2c6490b7 GIT binary patch literal 4223 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 literal 0 HcmV?d00001 diff --git a/src/github.com/matrix-org/dendrite/mediaapi/nfnt-96x96-crop.jpg b/src/github.com/matrix-org/dendrite/mediaapi/nfnt-96x96-crop.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1e424cd8b62bc1ab87df2db89c5b3da787572341 GIT binary patch literal 4896 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 literal 0 HcmV?d00001