dhash-vips 0.1.1.4 → 0.2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +6 -5
- data/common.rb +3 -13
- data/dhash-vips.gemspec +1 -1
- data/extconf.rb +22 -17
- data/lib/dhash-vips.rb +32 -30
- data/test.rb +122 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ffcb306bfad9804bd8f04b0e45be41792a31c631
|
4
|
+
data.tar.gz: 83cf911d2a2768694c7500101854c1b2d60dbac7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa5d434886611ab65c4c5c957ec4a19953681ab2ebfded077d8dd6ea18bc756083e9abd9d7b04db6aea9f1cdce4805445f045c3dc882ee2af1b63c062726dd3f
|
7
|
+
data.tar.gz: d0e444171d64f461b6cb4fde6fc23b58f7ca91e4160f05347948a88b490d2f2d9f664da4aa69ab7d375ecba8f298adb13262e66e4ba286bfa3f96a7dd971db62
|
data/Gemfile
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
|
-
gemspec
|
3
2
|
|
4
|
-
gem "byebug", "<11.1.0" # for Ruby 2.3
|
5
3
|
gem "rake"
|
6
|
-
gem "
|
7
|
-
gem "
|
4
|
+
gem "rmagick"
|
5
|
+
gem "dhash", github: "nakilon/dhash"
|
8
6
|
gem "phamilie"
|
9
|
-
gem "dhash"
|
10
7
|
gem "get_process_mem"
|
11
8
|
gem "mll"
|
9
|
+
gem "minitest"
|
10
|
+
gem "byebug", "<11.1.0" # for Ruby 2.3
|
11
|
+
|
12
|
+
gemspec
|
data/common.rb
CHANGED
@@ -1,20 +1,10 @@
|
|
1
|
-
def download_and_keep image # returns path
|
2
|
-
require "open-uri"
|
3
|
-
require "digest"
|
4
|
-
File.join(FileUtils.mkdir_p(File.expand_path "images", __dir__()).first, image).tap do |path|
|
5
|
-
open("https://storage.googleapis.com/dhash-vips.nakilon.pro/#{image}") do |link|
|
6
|
-
File.open(path, "wb") do |file|
|
7
|
-
IO.copy_stream link, file
|
8
|
-
end
|
9
|
-
end unless File.exist?(path) && Digest::MD5.file(path) == File.basename(image, ".jpg")
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
1
|
def download_if_needed path
|
14
2
|
require "open-uri"
|
15
3
|
require "digest"
|
16
4
|
FileUtils.mkdir_p File.dirname path
|
17
|
-
open("
|
5
|
+
open("http://gems.nakilon.pro.storage.yandexcloud.net/dhash-vips/#{File.basename path}".tap do |url|
|
6
|
+
puts "downloading #{path} from #{url}"
|
7
|
+
end) do |link|
|
18
8
|
File.open(path, "wb"){ |file| IO.copy_stream link, file }
|
19
9
|
end unless File.exist?(path) && Digest::MD5.file(path) == File.basename(path, File.extname(path))
|
20
10
|
path
|
data/dhash-vips.gemspec
CHANGED
data/extconf.rb
CHANGED
@@ -3,14 +3,12 @@ require "mkmf"
|
|
3
3
|
File.write "Makefile", dummy_makefile(?.).join
|
4
4
|
|
5
5
|
unless Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.3.8")
|
6
|
-
if
|
7
|
-
#
|
8
|
-
|
9
|
-
|
10
|
-
end
|
11
|
-
else
|
12
|
-
append_cppflags "-I/ruby/"
|
6
|
+
if ruby_source_dir = if File.directory? "/ruby"
|
7
|
+
"-I/ruby" # for Github Actions: docker (currently disabled) and benchmark
|
8
|
+
elsif ENV["RBENV_ROOT"] && ENV["RBENV_VERSION"] && File.exist?(t = "#{ENV["RBENV_ROOT"]}/sources/#{ENV["RBENV_VERSION"]}/ruby-#{ENV["RBENV_VERSION"]}/bignum.c") # https://github.com/rbenv/rbenv/issues/1199
|
9
|
+
"-I#{File.dirname t}"
|
13
10
|
end
|
11
|
+
append_cppflags ruby_source_dir
|
14
12
|
append_cppflags "-DRUBY_EXPORT" unless Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.4")
|
15
13
|
create_makefile "idhash"
|
16
14
|
# Why this hack?
|
@@ -21,15 +19,22 @@ unless Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.3.8")
|
|
21
19
|
test: all
|
22
20
|
\t$(RUBY) -r./lib/dhash-vips.rb ./lib/dhash-vips-post-install-test.rb
|
23
21
|
HEREDOC
|
22
|
+
end
|
24
23
|
end
|
25
24
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
#
|
31
|
-
#
|
32
|
-
|
33
|
-
|
34
|
-
#
|
35
|
-
#
|
25
|
+
__END__
|
26
|
+
|
27
|
+
to test: $ rake clean && rake install
|
28
|
+
|
29
|
+
# this unlike using rake is building to current directory
|
30
|
+
# that is vital to be able to require the native extention for benchmarking, etc.
|
31
|
+
$ ruby extconf.rb && make clean && make
|
32
|
+
$ ruby -e "require 'dhash-vips'; p DHashVips::IDHash.method(:distance3).source_location" # using -r makes bundler mad
|
33
|
+
# [".../dhash-vips.rb", 32] # if LoadError
|
34
|
+
# [".../dhash-vips.rb", 52] # if native (or 42 with Ruby<2.4)
|
35
|
+
|
36
|
+
Other cases to check:
|
37
|
+
1. not macOS && rbenv
|
38
|
+
2. fail during append_cppflags
|
39
|
+
3. failed compilation
|
40
|
+
4. failed tests
|
data/lib/dhash-vips.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "vips"
|
2
|
+
Vips.vector_set false
|
2
3
|
|
3
4
|
module DHashVips
|
4
5
|
|
@@ -9,27 +10,25 @@ module DHashVips
|
|
9
10
|
(a ^ b).to_s(2).count "1"
|
10
11
|
end
|
11
12
|
|
12
|
-
def pixelate
|
13
|
-
image = Vips::Image
|
14
|
-
|
15
|
-
image.resize((hash_size + 1).fdiv(image.width), vscale: hash_size.fdiv(image.height), kernel: kernel).colourspace("b-w")
|
13
|
+
def pixelate input, hash_size
|
14
|
+
image = if input.is_a? Vips::Image
|
15
|
+
input.thumbnail_image(hash_size + 1, height: hash_size, size: :force)
|
16
16
|
else
|
17
|
-
|
17
|
+
Vips::Image.thumbnail(input, hash_size + 1, height: hash_size, size: :force)
|
18
18
|
end
|
19
|
+
(image.has_alpha? ? image.flatten : image).colourspace("b-w")[0]
|
19
20
|
end
|
20
21
|
|
21
|
-
def calculate file, hash_size = 8
|
22
|
-
image = pixelate file, hash_size
|
23
|
-
|
22
|
+
def calculate file, hash_size = 8
|
23
|
+
image = pixelate file, hash_size
|
24
24
|
image.cast("int").conv([[1, -1]]).crop(1, 0, hash_size, hash_size).>(0)./(255).cast("uchar").to_a.join.to_i(2)
|
25
25
|
end
|
26
26
|
|
27
27
|
end
|
28
28
|
|
29
29
|
module IDHash
|
30
|
-
extend self
|
31
30
|
|
32
|
-
def distance3_ruby a, b
|
31
|
+
def self.distance3_ruby a, b
|
33
32
|
((a ^ b) & (a | b) >> 128).to_s(2).count "1"
|
34
33
|
end
|
35
34
|
begin
|
@@ -39,7 +38,7 @@ module DHashVips
|
|
39
38
|
else
|
40
39
|
# we can't just do `defined? Bignum` because it's defined but deprecated (some internal CONST_DEPRECATED flag)
|
41
40
|
if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.4")
|
42
|
-
def distance3 a, b
|
41
|
+
def self.distance3 a, b
|
43
42
|
if a.is_a?(Bignum) && b.is_a?(Bignum)
|
44
43
|
distance3_c a, b
|
45
44
|
else
|
@@ -50,7 +49,7 @@ module DHashVips
|
|
50
49
|
# https://github.com/ruby/ruby/commit/de2f7416d2deb4166d78638a41037cb550d64484#diff-16b196bc6bfe8fba63951420f843cfb4R10
|
51
50
|
require "rbconfig/sizeof"
|
52
51
|
FIXNUM_MAX = (1 << (8 * RbConfig::SIZEOF["long"] - 2)) - 1
|
53
|
-
def distance3 a, b
|
52
|
+
def self.distance3 a, b
|
54
53
|
if a > FIXNUM_MAX && b > FIXNUM_MAX
|
55
54
|
distance3_c a, b
|
56
55
|
else
|
@@ -59,7 +58,7 @@ module DHashVips
|
|
59
58
|
end
|
60
59
|
end
|
61
60
|
end
|
62
|
-
def distance a, b
|
61
|
+
def self.distance a, b
|
63
62
|
size_a, size_b = [a, b].map do |x|
|
64
63
|
# TODO write a test about possible hash sizes
|
65
64
|
# they were 32 and 128, 124, 120 for MRI 2.0
|
@@ -71,7 +70,7 @@ module DHashVips
|
|
71
70
|
((a ^ b) & (a | b) >> 2 * size_a * size_a).to_s(2).count "1"
|
72
71
|
end
|
73
72
|
|
74
|
-
|
73
|
+
def self.median array
|
75
74
|
h = array.size / 2
|
76
75
|
return array[h] if array[h] != array[h - 1]
|
77
76
|
right = array.dup
|
@@ -81,25 +80,28 @@ module DHashVips
|
|
81
80
|
return right.uniq[1] if left.count(left.last) > right.count(right.first)
|
82
81
|
left.last
|
83
82
|
end
|
84
|
-
|
85
|
-
fail unless
|
86
|
-
fail unless 3 ==
|
87
|
-
fail unless
|
88
|
-
fail unless 2 ==
|
89
|
-
fail unless 2 ==
|
90
|
-
fail unless
|
91
|
-
fail unless
|
92
|
-
fail unless 1 ==
|
83
|
+
private_class_method :median
|
84
|
+
fail unless 2 == median([1, 2, 2, 2, 2, 2, 3])
|
85
|
+
fail unless 3 == median([1, 2, 2, 2, 2, 3, 3])
|
86
|
+
fail unless 3 == median([1, 1, 2, 2, 3, 3, 3])
|
87
|
+
fail unless 2 == median([1, 1, 1, 2, 3, 3, 3])
|
88
|
+
fail unless 2 == median([1, 1, 2, 2, 2, 2, 3])
|
89
|
+
fail unless 2 == median([1, 2, 2, 2, 2, 3])
|
90
|
+
fail unless 3 == median([1, 2, 2, 3, 3, 3])
|
91
|
+
fail unless 1 == median([1, 1, 1])
|
92
|
+
fail unless 1 == median([1, 1])
|
93
93
|
|
94
|
-
def fingerprint
|
94
|
+
def self.fingerprint input, power = 3
|
95
95
|
size = 2 ** power
|
96
|
-
image = Vips::Image
|
97
|
-
|
98
|
-
|
99
|
-
|
96
|
+
image = if input.is_a? Vips::Image
|
97
|
+
input.thumbnail_image(size, height: size, size: :force)
|
98
|
+
else
|
99
|
+
Vips::Image.thumbnail(input, size, height: size, size: :force)
|
100
|
+
end
|
101
|
+
array = (image.has_alpha? ? image.flatten : image).flatten.colourspace("b-w")[0].to_enum.map &:flatten
|
100
102
|
d1, i1, d2, i2 = [array, array.transpose].flat_map do |a|
|
101
|
-
d = a.zip(a.rotate(1)).flat_map{ |r1, r2| r1.zip(r2).map{ |i,j| i - j } }
|
102
|
-
m =
|
103
|
+
d = a.zip(a.rotate(1)).flat_map{ |r1, r2| r1.zip(r2).map{ |i, j| i - j } }
|
104
|
+
m = median d.map(&:abs).sort
|
103
105
|
[
|
104
106
|
d.map{ |c| c < 0 ? 1 : 0 }.join.to_i(2),
|
105
107
|
d.map{ |c| c.abs >= m ? 1 : 0 }.join.to_i(2),
|
data/test.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
require "minitest/autorun"
|
2
2
|
|
3
|
-
|
3
|
+
require_relative "lib/dhash-vips"
|
4
4
|
|
5
5
|
# TODO tests about `fingerprint(4)`
|
6
6
|
|
7
7
|
[
|
8
|
-
[DHashVips::DHash, :hamming, :calculate, 2, 23,
|
8
|
+
[DHashVips::DHash, :hamming, :calculate, 2, 23, 9, 53, 7],
|
9
|
+
|
9
10
|
# vips-8.9.1-Tue Jan 28 13:05:46 UTC 2020
|
10
11
|
# [[0, 14, 26, 27, 31, 27, 32, 28, 43, 43, 34, 37, 37, 34, 35, 42],
|
11
12
|
# [14, 0, 28, 25, 39, 35, 32, 32, 43, 43, 38, 41, 41, 38, 37, 50],
|
@@ -23,7 +24,63 @@ require "dhash-vips"
|
|
23
24
|
# [34, 38, 32, 35, 33, 29, 32, 36, 31, 31, 26, 25, 19, 0, 21, 26],
|
24
25
|
# [35, 37, 27, 26, 40, 34, 23, 27, 28, 28, 29, 30, 26, 21, 0, 23],
|
25
26
|
# [42, 50, 36, 33, 31, 27, 34, 34, 27, 27, 18, 19, 23, 26, 23, 0]]
|
26
|
-
|
27
|
+
|
28
|
+
# vips-8.11.3-Wed Aug 11 09:29:27 UTC 2021
|
29
|
+
# [[0, 17, 25, 30, 30, 26, 35, 30, 42, 42, 35, 32, 36, 32, 34, 42],
|
30
|
+
# [17, 0, 28, 27, 39, 35, 32, 29, 43, 43, 38, 39, 43, 37, 37, 49],
|
31
|
+
# [25, 28, 0, 13, 35, 41, 28, 29, 41, 41, 38, 35, 33, 31, 27, 37],
|
32
|
+
# [30, 27, 13, 0, 36, 36, 31, 34, 38, 38, 35, 32, 40, 34, 26, 32],
|
33
|
+
# [30, 39, 35, 36, 0, 16, 35, 34, 40, 40, 31, 26, 28, 34, 40, 30],
|
34
|
+
# [26, 35, 41, 36, 16, 0, 41, 44, 38, 38, 23, 28, 26, 30, 34, 24],
|
35
|
+
# [35, 32, 28, 31, 35, 41, 0, 11, 27, 27, 38, 35, 33, 33, 21, 35],
|
36
|
+
# [30, 29, 29, 34, 34, 44, 11, 0, 28, 28, 37, 32, 36, 40, 30, 38],
|
37
|
+
# [42, 43, 41, 38, 40, 38, 27, 28, 0, 0, 33, 34, 30, 32, 28, 30],
|
38
|
+
# [42, 43, 41, 38, 40, 38, 27, 28, 0, 0, 33, 34, 30, 32, 28, 30],
|
39
|
+
# [35, 38, 38, 35, 31, 23, 38, 37, 33, 33, 0, 11, 23, 27, 31, 17],
|
40
|
+
# [32, 39, 35, 32, 26, 28, 35, 32, 34, 34, 11, 0, 24, 26, 30, 20],
|
41
|
+
# [36, 43, 33, 40, 28, 26, 33, 36, 30, 30, 23, 24, 0, 20, 26, 22],
|
42
|
+
# [32, 37, 31, 34, 34, 30, 33, 40, 32, 32, 27, 26, 20, 0, 20, 26],
|
43
|
+
# [34, 37, 27, 26, 40, 34, 21, 30, 28, 28, 31, 30, 26, 20, 0, 24],
|
44
|
+
# [42, 49, 37, 32, 30, 24, 35, 38, 30, 30, 17, 20, 22, 26, 24, 0]]
|
45
|
+
|
46
|
+
# v0.1.2.0
|
47
|
+
# [[0, 18, 25, 27, 28, 25, 33, 31, 39, 40, 33, 35, 32, 28, 36, 47],
|
48
|
+
# [18, 0, 31, 25, 34, 33, 33, 33, 39, 38, 37, 43, 40, 36, 40, 53],
|
49
|
+
# [25, 31, 0, 16, 31, 38, 26, 32, 42, 41, 36, 38, 31, 31, 31, 32],
|
50
|
+
# [27, 25, 16, 0, 35, 36, 26, 32, 38, 37, 34, 34, 41, 37, 27, 34],
|
51
|
+
# [28, 34, 31, 35, 0, 17, 39, 37, 41, 44, 31, 27, 26, 32, 32, 33],
|
52
|
+
# [25, 33, 38, 36, 17, 0, 46, 40, 38, 39, 24, 28, 25, 31, 25, 30],
|
53
|
+
# [33, 33, 26, 26, 39, 46, 0, 10, 26, 25, 34, 32, 31, 35, 33, 30],
|
54
|
+
# [31, 33, 32, 32, 37, 40, 10, 0, 26, 27, 34, 32, 33, 33, 33, 34],
|
55
|
+
# [39, 39, 42, 38, 41, 38, 26, 26, 0, 3, 36, 34, 35, 33, 37, 28],
|
56
|
+
# [40, 38, 41, 37, 44, 39, 25, 27, 3, 0, 35, 35, 36, 36, 36, 27],
|
57
|
+
# [33, 37, 36, 34, 31, 24, 34, 34, 36, 35, 0, 10, 23, 31, 23, 22],
|
58
|
+
# [35, 43, 38, 34, 27, 28, 32, 32, 34, 35, 10, 0, 23, 29, 23, 20],
|
59
|
+
# [32, 40, 31, 41, 26, 25, 31, 33, 35, 36, 23, 23, 0, 20, 24, 21],
|
60
|
+
# [28, 36, 31, 37, 32, 31, 35, 33, 33, 36, 31, 29, 20, 0, 20, 25],
|
61
|
+
# [36, 40, 31, 27, 32, 25, 33, 33, 37, 36, 23, 23, 24, 20, 0, 17],
|
62
|
+
# [47, 53, 32, 34, 33, 30, 30, 34, 28, 27, 22, 20, 21, 25, 17, 0]]
|
63
|
+
|
64
|
+
# v0.2.0.0
|
65
|
+
# [[0, 18, 26, 28, 28, 24, 35, 31, 42, 42, 32, 34, 33, 29, 35, 40],
|
66
|
+
# [18, 0, 30, 24, 38, 34, 33, 33, 44, 42, 38, 42, 41, 37, 37, 50],
|
67
|
+
# [26, 30, 0, 16, 34, 38, 29, 35, 42, 40, 36, 38, 31, 31, 31, 36],
|
68
|
+
# [28, 24, 16, 0, 36, 36, 31, 35, 40, 38, 34, 34, 41, 37, 27, 34],
|
69
|
+
# [28, 38, 34, 36, 0, 14, 35, 33, 40, 42, 32, 26, 27, 33, 35, 28],
|
70
|
+
# [24, 34, 38, 36, 14, 0, 43, 39, 38, 40, 24, 28, 25, 31, 29, 28],
|
71
|
+
# [35, 33, 29, 31, 35, 43, 0, 8, 27, 25, 35, 33, 32, 32, 28, 31],
|
72
|
+
# [31, 33, 35, 35, 33, 39, 8, 0, 27, 27, 35, 33, 34, 34, 28, 33],
|
73
|
+
# [42, 44, 42, 40, 40, 38, 27, 27, 0, 2, 34, 32, 31, 33, 31, 28],
|
74
|
+
# [42, 42, 40, 38, 42, 40, 25, 27, 2, 0, 34, 34, 33, 35, 31, 28],
|
75
|
+
# [32, 38, 36, 34, 32, 24, 35, 35, 34, 34, 0, 10, 23, 31, 25, 18],
|
76
|
+
# [34, 42, 38, 34, 26, 28, 33, 33, 32, 34, 10, 0, 23, 29, 25, 16],
|
77
|
+
# [33, 41, 31, 41, 27, 25, 32, 34, 31, 33, 23, 23, 0, 20, 24, 19],
|
78
|
+
# [29, 37, 31, 37, 33, 31, 32, 34, 33, 35, 31, 29, 20, 0, 22, 27],
|
79
|
+
# [35, 37, 31, 27, 35, 29, 28, 28, 31, 31, 25, 25, 24, 22, 0, 23],
|
80
|
+
# [40, 50, 36, 34, 28, 28, 31, 33, 28, 28, 18, 16, 19, 27, 23, 0]]
|
81
|
+
|
82
|
+
[DHashVips::IDHash, :distance, :fingerprint, 8, 21, 23, 72, 0],
|
83
|
+
|
27
84
|
# vips-8.9.1-Tue Jan 28 13:05:46 UTC 2020
|
28
85
|
# [[0, 16, 32, 35, 57, 45, 51, 50, 48, 47, 54, 48, 60, 50, 47, 56],
|
29
86
|
# [16, 0, 30, 34, 58, 47, 55, 56, 47, 50, 57, 49, 62, 52, 52, 61],
|
@@ -41,6 +98,61 @@ require "dhash-vips"
|
|
41
98
|
# [50, 52, 44, 40, 43, 42, 45, 45, 47, 49, 36, 30, 20, 0, 35, 39],
|
42
99
|
# [47, 52, 49, 41, 47, 43, 44, 41, 41, 44, 38, 37, 23, 35, 0, 19],
|
43
100
|
# [56, 61, 49, 51, 48, 42, 47, 42, 46, 43, 25, 27, 28, 39, 19, 0]]
|
101
|
+
|
102
|
+
# vips-8.11.3-Wed Aug 11 09:29:27 UTC 2021
|
103
|
+
# [[0, 17, 30, 35, 55, 46, 51, 54, 48, 46, 57, 48, 59, 52, 49, 54],
|
104
|
+
# [17, 0, 30, 37, 57, 46, 54, 55, 46, 49, 60, 50, 61, 54, 51, 58],
|
105
|
+
# [30, 30, 0, 12, 46, 57, 47, 42, 66, 59, 44, 37, 49, 44, 48, 49],
|
106
|
+
# [35, 37, 12, 0, 54, 67, 44, 41, 58, 53, 48, 41, 56, 42, 46, 48],
|
107
|
+
# [55, 57, 46, 54, 0, 23, 45, 43, 65, 63, 48, 48, 34, 42, 48, 47],
|
108
|
+
# [46, 46, 57, 67, 23, 0, 57, 56, 51, 50, 42, 48, 37, 38, 46, 40],
|
109
|
+
# [51, 54, 47, 44, 45, 57, 0, 6, 33, 34, 49, 43, 49, 41, 45, 47],
|
110
|
+
# [54, 55, 42, 41, 43, 56, 6, 0, 40, 39, 51, 50, 49, 40, 44, 44],
|
111
|
+
# [48, 46, 66, 58, 65, 51, 33, 40, 0, 10, 47, 53, 48, 46, 40, 46],
|
112
|
+
# [46, 49, 59, 53, 63, 50, 34, 39, 10, 0, 50, 57, 50, 49, 40, 43],
|
113
|
+
# [57, 60, 44, 48, 48, 42, 49, 51, 47, 50, 0, 9, 33, 32, 40, 23],
|
114
|
+
# [48, 50, 37, 41, 48, 48, 43, 50, 53, 57, 9, 0, 28, 27, 38, 28],
|
115
|
+
# [59, 61, 49, 56, 34, 37, 49, 49, 48, 50, 33, 28, 0, 21, 24, 27],
|
116
|
+
# [52, 54, 44, 42, 42, 38, 41, 40, 46, 49, 32, 27, 21, 0, 36, 35],
|
117
|
+
# [49, 51, 48, 46, 48, 46, 45, 44, 40, 40, 40, 38, 24, 36, 0, 21],
|
118
|
+
# [54, 58, 49, 48, 47, 40, 47, 44, 46, 43, 23, 28, 27, 35, 21, 0]]
|
119
|
+
|
120
|
+
# v0.1.2.0
|
121
|
+
# [[0, 17, 34, 40, 53, 43, 53, 52, 47, 47, 56, 44, 54, 51, 47, 57],
|
122
|
+
# [17, 0, 35, 33, 56, 45, 56, 52, 48, 49, 58, 49, 64, 57, 53, 58],
|
123
|
+
# [34, 35, 0, 8, 51, 57, 45, 40, 57, 54, 47, 40, 49, 47, 47, 48],
|
124
|
+
# [40, 33, 8, 0, 56, 62, 44, 40, 53, 47, 50, 41, 53, 41, 42, 47],
|
125
|
+
# [53, 56, 51, 56, 0, 21, 41, 48, 72, 65, 46, 47, 36, 43, 43, 43],
|
126
|
+
# [43, 45, 57, 62, 21, 0, 54, 56, 61, 60, 41, 47, 38, 39, 43, 39],
|
127
|
+
# [53, 56, 45, 44, 41, 54, 0, 12, 39, 40, 47, 44, 44, 38, 48, 41],
|
128
|
+
# [52, 52, 40, 40, 48, 56, 12, 0, 35, 36, 51, 50, 47, 39, 41, 43],
|
129
|
+
# [47, 48, 57, 53, 72, 61, 39, 35, 0, 11, 53, 53, 57, 48, 42, 51],
|
130
|
+
# [47, 49, 54, 47, 65, 60, 40, 36, 11, 0, 50, 54, 51, 49, 45, 47],
|
131
|
+
# [56, 58, 47, 50, 46, 41, 47, 51, 53, 50, 0, 13, 32, 36, 38, 23],
|
132
|
+
# [44, 49, 40, 41, 47, 47, 44, 50, 53, 54, 13, 0, 28, 30, 35, 27],
|
133
|
+
# [54, 64, 49, 53, 36, 38, 44, 47, 57, 51, 32, 28, 0, 21, 24, 28],
|
134
|
+
# [51, 57, 47, 41, 43, 39, 38, 39, 48, 49, 36, 30, 21, 0, 31, 35],
|
135
|
+
# [47, 53, 47, 42, 43, 43, 48, 41, 42, 45, 38, 35, 24, 31, 0, 19],
|
136
|
+
# [57, 58, 48, 47, 43, 39, 41, 43, 51, 47, 23, 27, 28, 35, 19, 0]]
|
137
|
+
|
138
|
+
# v0.2.0.0
|
139
|
+
# [[0, 17, 34, 40, 53, 43, 53, 52, 47, 47, 56, 44, 54, 51, 47, 57],
|
140
|
+
# [17, 0, 35, 33, 56, 45, 56, 52, 48, 49, 58, 49, 64, 57, 53, 58],
|
141
|
+
# [34, 35, 0, 8, 51, 57, 45, 40, 57, 54, 47, 40, 49, 47, 47, 48],
|
142
|
+
# [40, 33, 8, 0, 56, 62, 44, 40, 53, 47, 50, 41, 53, 41, 42, 47],
|
143
|
+
# [53, 56, 51, 56, 0, 21, 41, 48, 72, 65, 46, 47, 36, 43, 43, 43],
|
144
|
+
# [43, 45, 57, 62, 21, 0, 54, 56, 61, 60, 41, 47, 38, 39, 43, 39],
|
145
|
+
# [53, 56, 45, 44, 41, 54, 0, 12, 39, 40, 47, 44, 44, 38, 48, 41],
|
146
|
+
# [52, 52, 40, 40, 48, 56, 12, 0, 35, 36, 51, 50, 47, 39, 41, 43],
|
147
|
+
# [47, 48, 57, 53, 72, 61, 39, 35, 0, 11, 53, 53, 57, 48, 42, 51],
|
148
|
+
# [47, 49, 54, 47, 65, 60, 40, 36, 11, 0, 50, 54, 51, 49, 45, 47],
|
149
|
+
# [56, 58, 47, 50, 46, 41, 47, 51, 53, 50, 0, 13, 32, 36, 38, 23],
|
150
|
+
# [44, 49, 40, 41, 47, 47, 44, 50, 53, 54, 13, 0, 28, 30, 35, 27],
|
151
|
+
# [54, 64, 49, 53, 36, 38, 44, 47, 57, 51, 32, 28, 0, 21, 24, 28],
|
152
|
+
# [51, 57, 47, 41, 43, 39, 38, 39, 48, 49, 36, 30, 21, 0, 31, 35],
|
153
|
+
# [47, 53, 47, 42, 43, 43, 48, 41, 42, 45, 38, 35, 24, 31, 0, 19],
|
154
|
+
# [57, 58, 48, 47, 43, 39, 41, 43, 51, 47, 23, 27, 28, 35, 19, 0]]
|
155
|
+
|
44
156
|
].each do |lib, dm, calc, min_similar, max_similar, min_not_similar, max_not_similar, bw_exceptional|
|
45
157
|
|
46
158
|
describe lib do
|
@@ -62,14 +174,14 @@ require "dhash-vips"
|
|
62
174
|
[ %w{
|
63
175
|
71662d4d4029a3b41d47d5baf681ab9a.jpg ad8a37f872956666c3077a3e9e737984.jpg
|
64
176
|
}, bw_exceptional, bw_exceptional], # these are the same photo but of different size and colorspace
|
65
|
-
].each do |
|
177
|
+
].each do |_images, min, max|
|
66
178
|
|
67
179
|
require "fileutils"
|
68
180
|
require "digest"
|
69
181
|
require "mll"
|
70
182
|
|
71
183
|
require_relative "common"
|
72
|
-
images =
|
184
|
+
images = _images.map{ |_| download_if_needed "test_images/#{_}" }
|
73
185
|
|
74
186
|
hashes = images.map &lib.method(calc)
|
75
187
|
table = MLL::table[lib.method(dm), [hashes], [hashes]]
|
@@ -80,7 +192,7 @@ require "dhash-vips"
|
|
80
192
|
STDERR.puts ""
|
81
193
|
|
82
194
|
hashes.size.times.to_a.repeated_combination(2) do |i, j|
|
83
|
-
it do
|
195
|
+
it "#{_images[i]} #{_images[j]}" do
|
84
196
|
case
|
85
197
|
when i == j
|
86
198
|
assert_predicate table[i][j], :zero?
|
@@ -96,6 +208,10 @@ require "dhash-vips"
|
|
96
208
|
|
97
209
|
end
|
98
210
|
|
211
|
+
it "accepts Vips::Image" do
|
212
|
+
lib.public_send calc, Vips::Image.new_from_buffer("GIF89a\x01\x00\x01\x00\x80\x01\x00\xFF\xFF\xFF\x00\x00\x00,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;", "")
|
213
|
+
end
|
214
|
+
|
99
215
|
end
|
100
216
|
|
101
217
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dhash-vips
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor Maslov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-vips
|