Шестнадцатеричное число цвета фона к переменной JavaScript

Вот забавный базовый метод R с Reduce.

Reduce(cbind,
       list(Reduce("+", list(df1[intersect(names(df1), names(df2))],
                             df2[intersect(names(df1), names(df2))])), # sum results
                             df1[setdiff(names(df1), names(df2))], # in df1, not df2
                             df2[setdiff(names(df2), names(df1))])) # in df2, not df1

Возвращает

  A C D B
1 2 2 1 1
2 4 4 2 2

Предполагается, что оба столбца df1 и df2 имеют столбцы, которых нет в другом. Если это не так, вам придется скорректировать список.

Обратите внимание, что вы можете заменить Reduce на do.call в обоих местах, и вы получите тот же результат.

36
задан Blazemonger 13 December 2013 в 19:31
поделиться

6 ответов

испытайте это:

var rgbString = "rgb(0, 70, 255)"; // get this in whatever way.

var parts = rgbString.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
// parts now should be ["rgb(0, 70, 255", "0", "70", "255"]

delete (parts[0]);
for (var i = 1; i <= 3; ++i) {
    parts[i] = parseInt(parts[i]).toString(16);
    if (parts[i].length == 1) parts[i] = '0' + parts[i];
} 
var hexString ='#'+parts.join('').toUpperCase(); // "#0070FF"

В ответ на вопрос в комментариях ниже:

я пытаюсь изменить regex для обработки и rgb и rgba, зависящего, какой я получаю. Какие-либо подсказки? Спасибо.

я не абсолютно уверен, если это имеет смысл в контексте этого вопроса (так как Вы не можете представить rgba, раскрашивают шестнадцатеричное число), но я предполагаю, что могло быть другое использование. Так или иначе Вы могли изменить regex, чтобы быть похожими на это:

/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(0\.\d+))?\)$/

Пример произвел:

var d = document.createElement('div');
d.style.backgroundColor = 'rgba( 255,  60, 50, 0)';

/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(1|0\.\d+))?\)$/.exec(d.style.backgroundColor);

// ["rgba(255, 60, 50, 0.33)", "255", "60", "50", "0.33"]
62
ответ дан ehird 27 November 2019 в 05:28
поделиться

Можно выбрать цвет CSS, использующий rgb также, такой как это:

background-color: rgb(0, 70, 255);

Это действительный CSS , не волноваться.

<час>

Редактирование: Видят ответ nickf для хорошего способа преобразовать его, если Вы абсолютно должны.

8
ответ дан Community 27 November 2019 в 05:28
поделиться

Некоторое время назад я нашел другую функцию ( от R0bb13 ). У него нет регулярного выражения, поэтому мне пришлось позаимствовать его у nickf, чтобы он работал правильно. Я публикую его только потому, что это интересный метод, который не использует оператор if или цикл, чтобы дать вам результат. Также этот скрипт возвращает шестнадцатеричное значение с # (это было необходимо для плагина Farbtastic , который я использовал в то время)

//Function to convert hex format to a rgb color
function rgb2hex(rgb) {
 var hexDigits = ["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];
 rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
 function hex(x) {
  return isNaN(x) ? "00" : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16];
 }
 return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}

// call the function: rgb( "rgb(0, 70, 255)" );
// returns: #0046ff

Примечание: шестнадцатеричный результат сценария nickf должен быть 0046ff, а не 0070ff, но ничего страшного: P

Update, еще один лучший альтернативный метод:

function rgb2hex(rgb) {
 rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
 function hex(x) {
  return ("0" + parseInt(x).toString(16)).slice(-2);
 }
 return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}
5
ответ дан 27 November 2019 в 05:28
поделиться

Я провожу некоторое время, работая над этим, а также над приложением, для которого я был заключен контракт. В основном, поскольку API в настоящее время существует, это невозможно. Основной проблемой является класс UIImage STRIPS все данные EXIF, за исключением ориентации out. Кроме того, функция сохранения в ролле камеры удаляет эти данные. Таким образом, единственный способ захватить и сохранить любые дополнительные данные EXIF - сохранить их в частном «ролле камеры» в вашем приложении. Я также подал эту ошибку на яблоко и подчеркнул необходимость для представителей рецензента приложения, с которыми мы контактировали. Надеюсь, когда-нибудь они добавят его в.. В противном случае это делает использование тегов GEO совершенно бесполезным, поскольку оно работает только в приложении камеры «stock».

ПРИМЕЧАНИЕ Некоторые приложения в магазине приложений взламывают . Благодаря тому, что я обнаружил, прямой доступ к роллу камеры и сохранение фотографий прямо к нему, чтобы сохранить данные GEO. Тем не менее, это работает только с камерой ролл/сохраненных фотографий, а НЕ остальной части фотобиблиотеки. Фотографии, «синхронизированные» с телефоном с компьютера, содержат все данные EXIF, за исключением ориентации.

Я до сих пор не могу понять, почему эти заявки были одобрены (черт возьми, они даже DELETE из рулона камеры), и наше приложение, которое не делает ничего из этого, все еще сдерживается.

-121--990387-

Вы пробовали следующее?

SELECT users.*,
   (SELECT count(*) FROM bookshelf WHERE bookshelf.user_id = users.ID) as titles,
   ((SELECT count(*) FROM book_reviews WHERE book_reviews.user_id = users.ID) +
   (SELECT count(*) FROM recipe_reviews WHERE recipe_reviews.user_id = users.ID)) as reviewtotal
FROM users   
-121--3632207-

Я нашел это решение http://haacked.com/archive/2009/12/29/convert-rgb-to-hex.aspx и использую его в своем проекте

0
ответ дан 27 November 2019 в 05:28
поделиться

Эти решения не работают в Chrome, поскольку он возвращает rgba (x, x, x, x) для фона - цвет.

РЕДАКТИРОВАТЬ: Это не обязательно так. Chrome по-прежнему будет устанавливать фон с помощью rgb (), в зависимости от того, что вы делаете. Скорее всего, пока не применяется альфа-канал, Chrome будет отвечать rgb вместо rgba.

1
ответ дан 27 November 2019 в 05:28
поделиться

Как насчет этого решения, функция stringRGB2HEX возвращает копию входной строки, где все вхождения цветов в формате «rgb (r, g, b)» были заменен шестнадцатеричным форматом "#rrggbb".

   //function for private usage of the function below
   //(declaring this one in global scope should make it faster rather than 
   //declaraing it as temporary function inside stringRGB2HEX that need to be
   //instantieted at every call of stringRGB2HEX
   function _rgb2hex(rgb_string, r, g, b) 
   {
      //VERY IMPORTANT: by adding (1 << 24) we avoid 'rgb(0, 0, 0)' to be mistakenly converted into '#0'
      var rgb = (1 << 24) | (parseInt(r) << 16) | (parseInt(g) << 8) | parseInt(b); //same thing of: ( r + (256 * g) + (65536 * b) + 16777216)
      //toString(16) specify hex 16 radix, works only for numbers [source: http://msdn.microsoft.com/en-us/library/dwab3ed2(v=VS.85).aspx]   
      return '#' + rgb.toString(16).substr(1); //substr(1) because we have to remove the (1 << 24) added above
   }

   function stringRGB2HEX(string)
   {
      if(typeof string === 'string')
         string = string.replace(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/g, _rgb2hex);
      return string;
   }

Он также преобразует цвета RGB в сложные стили, такие как background .

Значение style.background , например: «Нет прокрутки без повтора, rgb (0, 0, 0)» легко преобразовать в «Прокрутка без повтора» # 000000 ", просто выполнив stringRGB2HEX (style.background)

1
ответ дан 27 November 2019 в 05:28
поделиться
Другие вопросы по тегам:

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