【问题标题】:How do I Convert ARGB value from string to colour?如何将 ARGB 值从字符串转换为颜色?
【发布时间】:2010-04-22 13:52:15
【问题描述】:

我正在尝试在 GDIPAPI 单元中使用 MakeColor 方法,但从 intbyte 的转换没有返回正确的值。

示例

var
    argbStr: string;
    A, R, G, B: Byte;
begin
    argbStr := 'ffffcc88';
    A := StrToInt('$' + Copy(AValue, 1, 2));
    R := StrToInt('$' + Copy(AValue, 3, 2));
    G := StrToInt('$' + Copy(AValue, 5, 2));
    B := StrToInt('$' + Copy(AValue, 7, 2));
    Result := MakeColor(A, R, G, B);
end;

我做错了什么?

【问题讨论】:

  • 两件事。首先,您的结果类型应该是什么?其次,第一个 Copy 调用不应该说 1,而不是 0,作为第一个参数吗?
  • 另外,GDIAPI 来自哪里?我的 Delphi 2010 安装中没有该单元。
  • @Mason,我提到了MakeColor 方法在 GDIPAPI 单元中它是 GDI+ 的一部分...返回类型是一个 TValue。
  • MakeColor 的返回类型是ARGB,而不是TValue。也许这就是问题所在。你期望得到什么“正确的价值”,而你得到了什么价值?中间变量的值是多少?
  • @Rob,我明白这一点。我使用 TValue 是因为该方法是通用的。我在设置值时会进行相关的转换。

标签: delphi gdi+ argb


【解决方案1】:

您的字符串中的颜色分量与它们在ARGB 值中的顺序相同。因此,在将它们与MakeColor 组合之前,您不需要将它们分开。您可以直接进行转换:

function StringToARGB(const argbStr: string): GDIPAPI.ARGB;
begin
  Result := ARGB(StrToInt('$' + argbStr));
end;

类型转换对于抑制 alpha 分量大于 127 时出现的范围检查错误是必要的; StrToInt 返回有符号整数,但 ARGB 是无符号类型。

【讨论】:

  • @Rob,更好!如果我只有RBG怎么办?我可以将ff 附加到字符串吗?
  • 我猜你的意思是写StrToInt,而不是IntToStr
  • 是的。或者,如果你想确保你可能得到的任何颜色都是完全的,所以这个:Result := AlphaMask or ARGB(StrToInt('$' + argbStr));
【解决方案2】:

A, R, G, B 的类型更改为整数似乎可以解决问题。它必须与 Integer -> Byte 之间的转换有关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2016-04-17
    • 2017-06-29
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多