C преобразовать целое число в шестнадцатеричную строку для цвета в Graphicsmagick

#c #colors #hex #graphicsmagick

#c #Цвет #шестнадцатеричная #graphicsmagick

Вопрос:

Как я могу преобразовать целое число в диапазоне от 0 до 255 в строку, содержащую ровно два символа, сохраняя шестнадцатеричное представление числа?

Пример

ввод: 180 вывод: «B4»

Моя цель — установить оттенки серого в Graphicsmagick. Итак, взяв тот же пример, я хочу получить следующий конечный результат:

«#B4B4B4»

чтобы я мог использовать его для присвоения цвета: Color(«#B4B4B4»);

Должно быть легко, не так ли?

Ответ №1:

Вам не нужно. Это более простой способ:

 ColorRGB(red/255., green/255., blue/255.)
  

Комментарии:

1. У меня есть еще один вопрос, как я могу установить прозрачность этого цвета?

2. @Alp: пожалуйста, обратитесь к документации используемой вами библиотеки.

3. Я не понимаю, как использовать класс ColorRGB и устанавливать для альфа-канала пользовательское значение.

4. Я пробовал: Color color = ColorRGB(R, G, B); color.alpha(.5); но, похоже, это не работает, по-прежнему нет непрозрачности.

5. @Alp: вот как это должно работать. Если этого не происходит, это означает, что проблема в чем-то другом (вероятно, в том месте, где вы используете цвет).

Ответ №2:

Вы можете использовать встроенные функции форматирования части IOStreams стандартной библиотеки C , например:

 #include <string>
#include <sstream>
#include <iostream>
#include <ios>
#include <iomanip>

std::string getHexCode(unsigned char c) {

   // Not necessarily the most efficient approach,
   // creating a new stringstream each time.
   // It'll do, though.
   std::stringstream ss;

   // Set stream modes
   ss << std::uppercase << std::setw(2) << std::setfill('0') << std::hex;

   // Stream in the character's ASCII code
   // (using ` ` for promotion to `int`)
   ss <<  c;

   // Return resultant string content
   return ss.str();
}

int main() {
   // Output: "B4, 04"
   std::cout << getHexCode(180) << ", " << getHexCode(4); 
}
  

Живой пример.

Ответ №3:

Используя printf с %x помощью спецификатора формата. В качестве альтернативы, strtol можно указать базовое значение как 16.

 #include<cstdio>

int main()
{

    int a = 180;
    printf("%xn", a);

    return 0;
}
  

Комментарии:

1. Если вы собираетесь настаивать на использовании устаревших функций C, включайте cstdio не stdio.h .

2. @Tomalak Geret’kal: Хотя я согласен с комментарием cstdio (и я тоже внес изменения) Я не думаю, что нет ничего плохого в использовании устаревших функций C в C .

3. Я тоже этого не делаю (хотя я думаю, что есть разница между его использованием и рекомендацией . : P)

4. @Tomalak Geret’kal: Что ж, если использовать неплохо, рекомендация тоже не может быть плохой.

5. Вряд ли. То, что опытный программист на C знает достаточно о том, что он делает, чтобы безопасно использовать отдельные фрагменты устаревшего C здесь и там, не означает, что разумно поощрять новичка делать это. Немного похоже на то, как я использую cplusplus.com в качестве ссылки, потому что я достаточно опытен, чтобы обнаруживать ошибки; даже через миллион лет я не стал бы рекомендовать это как ресурс всем, кто им не является.