【问题标题】:Hex Pair to Hex Shorthand十六进制对到十六进制速记
【发布时间】:2011-02-27 22:49:30
【问题描述】:

我有一堆 Color 对象 (.Net)。我想将它们转换为十六进制,这很简单,例如:

Dim clr As Color = Color.FromArgb(255, 0, 0)
Dim clrString = ColorTranslator.ToHtml(clr)

.Net 或通过 RegEx(或其他方式)有没有一种方法可以确定指定的 Color 是否可以使用十六进制简写(如 #F00),然后将其转换为那个?因此,对于可以具有 Hex 速记的颜色,请转换为该颜色,否则,请转换为 Hex Pair #FF0000

【问题讨论】:

    标签: .net colors hex


    【解决方案1】:
    ^#([0-9A-F])\1([0-9A-F])\2([0-9A-F])\3$
    

    这使用 3 个反向引用来检查每个十六进制数字后面是否有一个副本。所以任何带有#xxyyzz 模式(可以转换为#xyz)的东西都匹配。

    【讨论】:

    • 谢谢马修。不幸的是,这只是让我了解它与FF00 一起工作的一部分。它不提供像 Color.Olive 这样的颜色的匹配,它是 #808000,可以用十六进制简写写成 #880
    • 做了更多研究,结果发现速记只能从十六进制对中写入。您的代码效果很好!我还发现,如果颜色值字节可以除以 17 并返回一个整数(即它不是浮点数),那么它可以写成简写形式。不知道这背后的数学原理,但这很酷。
    • 17 是 0x11。所有带有双倍十六进制数字的字节都是它的倍数。
    【解决方案2】:

    此链接描述了速记十六进制表示法的工作原理。

    Shorthand Hex Notation

    因此,理论上,任何允许您分析 Hex RGB 值并检测“重复双精度”字符值的实现都应该能够将其简化为 Hex Shorthand。

    干杯

    【讨论】: