From 94cb7239aaa4be149bfa102a9160eca4404ab501 Mon Sep 17 00:00:00 2001 From: Ken Collins Date: Sun, 11 Aug 2019 14:49:24 -0400 Subject: [PATCH] Use Int Precision w/Vips During Sharpen (#56) Work in #22 added automatic image sharpening for Vips. However, discovered in #55 `conv()` defaults to float precision and can leave to visual artifacts in some scenarios. Per @jcupitt recommendation, we can add `precision: :integer` to conv and this should also give us a speed-up, since int convolutions will use SIMD. https://github.com/janko/image_processing/issues/55 Fixes #55 --- lib/image_processing/vips.rb | 2 +- test/vips_test.rb | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/image_processing/vips.rb b/lib/image_processing/vips.rb index 78a423c..849bb02 100644 --- a/lib/image_processing/vips.rb +++ b/lib/image_processing/vips.rb @@ -140,7 +140,7 @@ def thumbnail(width, height, sharpen: SHARPEN_MASK, **options) else image = self.image.thumbnail_image(width, height: height, **options) end - image = image.conv(sharpen) if sharpen + image = image.conv(sharpen, precision: :integer) if sharpen image end diff --git a/test/vips_test.rb b/test/vips_test.rb index 905df62..b0f19d6 100644 --- a/test/vips_test.rb +++ b/test/vips_test.rb @@ -174,6 +174,11 @@ normal = @pipeline.resize_to_limit!(400, 400, sharpen: false) assert sharpened.size > normal.size, "Expected sharpened thumbnail to have bigger filesize than not sharpened thumbnail" end + + it "sharpening uses integer precision" do + sharpened = @pipeline.resize_to_limit(400, 400).call(save: false) + assert_equal :uchar, sharpened.format + end end describe "#resize_to_fit" do @@ -217,6 +222,11 @@ normal = @pipeline.resize_to_fit!(400, 400, sharpen: false) assert sharpened.size > normal.size, "Expected sharpened thumbnail to have bigger filesize than not sharpened thumbnail" end + + it "sharpening uses integer precision" do + sharpened = @pipeline.resize_to_limit(400, 400).call(save: false) + assert_equal :uchar, sharpened.format + end end describe "#resize_to_fill" do @@ -248,6 +258,11 @@ normal = @pipeline.resize_to_fill!(400, 400, sharpen: false) assert sharpened.size > normal.size, "Expected sharpened thumbnail to have bigger filesize than not sharpened thumbnail" end + + it "sharpening uses integer precision" do + sharpened = @pipeline.resize_to_limit(400, 400).call(save: false) + assert_equal :uchar, sharpened.format + end end describe "#resize_and_pad" do @@ -297,6 +312,11 @@ normal = @pipeline.resize_and_pad!(400, 400, sharpen: false) assert sharpened.size > normal.size, "Expected sharpened thumbnail to have bigger filesize than not sharpened thumbnail" end + + it "sharpening uses integer precision" do + sharpened = @pipeline.resize_to_limit(400, 400).call(save: false) + assert_equal :uchar, sharpened.format + end end describe "#rotate" do