Интервал RGB к RGB - Python

Как я могу преобразовать целое число RGB в соответствующий кортеж RGB (R,G,B)? Кажется достаточно простым, но я ничего не могу найти на Google.

Я знаю это для каждого RGB (r,g,b) у Вас есть целое число n = r256^2 + g256 + b, как я могу решить реверс в Python, IE, данный n, Мне нужно r,g,b значения.

17
задан Omar 14 February 2010 в 17:59
поделиться

5 ответов

Вероятно, есть более короткий способ сделать это:

dec=10490586
hex="%06x" % dec
r=hex[:2]
g=hex[2:4]
b=hex[4:6]
rgb=(r,g,b)

EDIT: это неправильно - дает ответ в Hex, OP хотел int. EDIT2: уточнено, чтобы уменьшить страдания и неудачи - необходимо '% 06x', чтобы шестнадцатеричный всегда показывался в виде шести цифр [благодаря комментарию Питера Хансена].

-121--2289746-

Довольно URL для Rails 3.x и Rails 2.x без необходимости какого-либо внешнего плагина, но с небольшим взломом, к сожалению.

routes.rb

map.resources :posts, :except => [:show]
map.post '/:year/:month/:slug', :controller => :posts, :action => :show, :year => /\d{4}/, :month => /\d{2}/, :slug => /[a-z0-9\-]+/

application _ controller.rb

def default_url_options(options = {})
  # resource hack so that url_for(@post) works like it should
  if options[:controller] == 'posts' && options[:action] == 'show'
    options[:year] = @post.year
    options[:month] = @post.month
  end
  options
end

post.rb

def to_param # optional
  slug
end

def year
  published_on.year
end

def month
  published_on.strftime('%m')
end

view

<%= link_to 'post', @post %>

Примечание. Для Rails 3.x можно использовать следующее определение маршрута:

resources :posts
match '/:year/:month/:slug', :to => "posts#show", :as => :post, :year => /\d{4}/, :month => /\d{2}/, :slug => /[a-z0-9\-]+/

Имеется ли значок для ответа на ваш вопрос?;)

Btw: файл routing _ test является хорошим местом

Update: При использовании default _ url _ options используется тупик . Разнесенное решение работает только в том случае, если в контроллере определена переменная @ post . Если, например, существует переменная @ posts с массивом записей, нам не повезло (поскольку параметры default _ url _ не имеют доступа к просмотру переменных, например, p в @ posts.each do | p | .

Таким образом, это все еще открытая проблема. Кто-нибудь поможет?

-121--4268377-

Я не эксперт по Python во всех отношениях, но насколько я знаю, он имеет те же операторы, что и C.

Если это должно работать, и это также должно быть намного быстрее, чем использование модуля и деления.

Blue =  RGBint & 255
Green = (RGBint >> 8) & 255
Red =   (RGBint >> 16) & 255

Что он делает, чтобы замаскировать самый низкий байт в каждом случае (двоичный и с 255.. Равно 8 единицам). Для зеленого и красного компонентов он делает то же самое, но сначала смещает цветовой канал в нижний байт.

43
ответ дан 30 November 2019 в 10:01
поделиться

Я бы пошел с NUnit .

Некоторые ссылки: NUnit QuickStart , NuGet Package

-121--872731-

Лично я предпочитаю платформу тестирования устройств Visual Studio по двум основным причинам:

  • Она легко интегрируется с IDE;

Сказав, что практически любая структура модульного тестирования сделает трюк, важно иметь тесты!

-121--872732-

Из RGB целого числа:

Blue =  RGBint mod 256
Green = RGBint / 256 mod 256
Red =   RGBint / 256 / 256 mod 256

Это может быть довольно просто реализовано, как только вы знаете, как его получить.:)

Upd: Добавлена функция python. Не уверен, что есть лучший способ сделать это, но это работает на Python 3 и 2,4

def rgb_int2tuple(rgbint):
    return (rgbint // 256 // 256 % 256, rgbint // 256 % 256, rgbint % 256)

Есть также отличное решение, которое использует битшифтинг и маскирование, что, несомненно, гораздо быстрее, что Нильс Пипенбринк опубликовал.

14
ответ дан 30 November 2019 в 10:01
поделиться

Я предполагаю, что у вас есть 32-битное целое число, содержащее значения RGB (например, ARGB). Затем вы можете распаковать двоичные данные, используя struct модуль:

# Create an example value (this represents your 32-bit input integer in this example).
# The following line results in exampleRgbValue = binary 0x00FF77F0 (big endian)
exampleRgbValue = struct.pack(">I", 0x00FF77F0)

# Unpack the value (result is: a = 0, r = 255, g = 119, b = 240)
a, r, g, b = struct.unpack("BBBB", exampleRgbValue)
6
ответ дан 30 November 2019 в 10:01
поделиться

Возможно, есть более короткий способ сделать это:

dec=10490586
hex="%06x" % dec
r=hex[:2]
g=hex[2:4]
b=hex[4:6]
rgb=(r,g,b)

EDIT: это неправильно - дает ответ в Hex, ОП хотел int. EDIT2: уточнено, чтобы уменьшить страдания и неудачи - нужно '%06x', чтобы шестнадцатеричное число всегда отображалось как шесть цифр [благодаря комментарию Питера Хансена].

0
ответ дан 30 November 2019 в 10:01
поделиться
def unpack2rgb(intcol):
    tmp, blue= divmod(intcol, 256)
    tmp, green= divmod(tmp, 256)
    alpha, red= divmod(tmp, 256)
    return alpha, red, green, blue

Если бы только предложение divmod(value, (divider1, divider2, divider3...)) было принято, оно бы упростило и различные преобразования времени.

2
ответ дан 30 November 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: