mirror of
https://github.com/mastodon/mastodon.git
synced 2024-11-26 15:31:52 +00:00
Simplify color extraction code using bandunfold
(#30869)
Some checks are pending
Check i18n / check-i18n (push) Waiting to run
CodeQL / Analyze (javascript) (push) Waiting to run
CodeQL / Analyze (ruby) (push) Waiting to run
Check formatting / lint (push) Waiting to run
Ruby Linting / lint (push) Waiting to run
Historical data migration test / pre_job (push) Waiting to run
Historical data migration test / test (14-alpine) (push) Blocked by required conditions
Historical data migration test / test (15-alpine) (push) Blocked by required conditions
Ruby Testing / build (production) (push) Waiting to run
Ruby Testing / build (test) (push) Waiting to run
Ruby Testing / test (.ruby-version) (push) Blocked by required conditions
Ruby Testing / test (3.1) (push) Blocked by required conditions
Ruby Testing / test (3.2) (push) Blocked by required conditions
Ruby Testing / Libvips tests (.ruby-version) (push) Blocked by required conditions
Ruby Testing / Libvips tests (3.1) (push) Blocked by required conditions
Ruby Testing / Libvips tests (3.2) (push) Blocked by required conditions
Ruby Testing / End to End testing (.ruby-version) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.1) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:8.10.2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, opensearchproject/opensearch:2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.1, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.2, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Some checks are pending
Check i18n / check-i18n (push) Waiting to run
CodeQL / Analyze (javascript) (push) Waiting to run
CodeQL / Analyze (ruby) (push) Waiting to run
Check formatting / lint (push) Waiting to run
Ruby Linting / lint (push) Waiting to run
Historical data migration test / pre_job (push) Waiting to run
Historical data migration test / test (14-alpine) (push) Blocked by required conditions
Historical data migration test / test (15-alpine) (push) Blocked by required conditions
Ruby Testing / build (production) (push) Waiting to run
Ruby Testing / build (test) (push) Waiting to run
Ruby Testing / test (.ruby-version) (push) Blocked by required conditions
Ruby Testing / test (3.1) (push) Blocked by required conditions
Ruby Testing / test (3.2) (push) Blocked by required conditions
Ruby Testing / Libvips tests (.ruby-version) (push) Blocked by required conditions
Ruby Testing / Libvips tests (3.1) (push) Blocked by required conditions
Ruby Testing / Libvips tests (3.2) (push) Blocked by required conditions
Ruby Testing / End to End testing (.ruby-version) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.1) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:8.10.2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, opensearchproject/opensearch:2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.1, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.2, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
This commit is contained in:
parent
1bccba1408
commit
ba6a558a70
|
@ -116,34 +116,23 @@ module Paperclip
|
|||
# The number of occurrences of a color (r, g, b) is thus encoded in band `b` at pixel position `(r, g)`
|
||||
histogram = image.hist_find_ndim(bins: BINS)
|
||||
|
||||
# `histogram.max` returns an array of maxima with their pixel positions, but we don't know in which
|
||||
# band they are
|
||||
# With `bandunfold`, we get back to a (BINS*BINS)×BINS 2D image with a single band.
|
||||
# The number of occurrences of a color (r, g, b) is thus encoded at pixel position `(r * BINS + b, g)`
|
||||
histogram = histogram.bandunfold
|
||||
|
||||
_, colors = histogram.max(size: 10, out_array: true, x_array: true, y_array: true)
|
||||
|
||||
colors['out_array'].zip(colors['x_array'], colors['y_array']).map do |v, x, y|
|
||||
rgb_from_xyv(histogram, x, y, v)
|
||||
end.flatten.reverse.uniq
|
||||
colors['x_array'].zip(colors['y_array']).map do |x, y|
|
||||
rgb_from_hist_xy(x, y)
|
||||
end.flatten.reverse
|
||||
end
|
||||
|
||||
# rubocop:disable Naming/MethodParameterName
|
||||
def rgb_from_xyv(image, x, y, v)
|
||||
pixel = image.getpoint(x, y)
|
||||
|
||||
# As we only have the first 2 dimensions for this maximum, we
|
||||
# can't distinguish with different maxima with the same `r` and `g`
|
||||
# values but different `b` values.
|
||||
#
|
||||
# Therefore, we return an array of maxima, which is always non-empty,
|
||||
# but may contain multiple colors with the same values.
|
||||
|
||||
pixel.filter_map.with_index do |pv, z|
|
||||
next if pv != v
|
||||
|
||||
r = (x + 0.5) * 256 / BINS
|
||||
g = (y + 0.5) * 256 / BINS
|
||||
b = (z + 0.5) * 256 / BINS
|
||||
ColorDiff::Color::RGB.new(r, g, b)
|
||||
end
|
||||
def rgb_from_hist_xy(x, y)
|
||||
r = ((x / BINS) + 0.5) * 256 / BINS
|
||||
g = (y + 0.5) * 256 / BINS
|
||||
b = ((x % BINS) + 0.5) * 256 / BINS
|
||||
ColorDiff::Color::RGB.new(r, g, b)
|
||||
end
|
||||
|
||||
def w3c_contrast(color1, color2)
|
||||
|
|
Loading…
Reference in New Issue
Block a user