【问题标题】:C++ convert integer to hex string for Color in GraphicsmagickC ++将整数转换为Graphicsmagick中颜色的十六进制字符串
【发布时间】:2026-01-25 03:45:01
【问题描述】:

如何将 0 到 255 之间的整数转换为正好有两个字符的字符串,其中包含数字的十六进制表示?

例子

输入:180 输出:“B4”

我的目标是在 Graphicsmagick 中设置灰度颜色。所以,以同样的例子,我想要以下最终输出:

“#B4B4B4”

以便我可以使用它来分配颜色:Color("#B4B4B4");

应该很容易吧?

【问题讨论】:

    标签: c++ colors hex graphicsmagick


    【解决方案1】:

    你不需要。这是一种更简单的方法:

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

    【讨论】:

    • 我还有一个问题,如何设置这个颜色的透明度?
    • @Alp:请参考您正在使用的库的documentation
    • 我看不到如何使用 ColorRGB 类并将 alpha 通道设置为自定义值。
    • 我试过了:Color color = ColorRGB(R, G, B); color.alpha(.5); 但它似乎不起作用,仍然没有不透明度。
    • @Alp:它应该是这样工作的。如果不是,则意味着问题出在其他地方(可能在您使用颜色的地方)。
    【解决方案2】:

    您可以使用 C++ 标准库的 IOStreams 部分的原生格式化功能,如下所示:

    #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); 
    }
    

    Live example.

    【讨论】:

      【解决方案3】:

      使用printf 使用%x 格式说明符。或者,strtol 将基数指定为 16。

      #include<cstdio>
      
      int main()
      {
      
          int a = 180;
          printf("%x\n", a);
      
          return 0;
      }
      

      【讨论】:

      • 如果您要坚持使用旧版 C 功能,请包括 cstdio 而不是 stdio.h
      • @Tomalak Geret'kal:虽然我同意 cstdio 的评论(我也做出了改变),但我认为在 C++ 中使用遗留 C 功能没有任何问题。
      • 我也没有(虽然我认为使用它和推荐它是有区别的。:P)
      • @Tomalak Geret'kal:好吧,如果使用还不错,推荐也不错。
      • 几乎没有。仅仅因为一个有经验的 C++ 程序员足够了解他正在做什么来安全地到处使用遗留 C 的奇怪部分,并不意味着鼓励初学者这样做是明智的。有点像我如何使用 cplusplus.com 作为参考,因为我有足够的经验来发现错误;在一百万年后我不会推荐它作为资源给任何不是的人。