如何将ARGB值从字符串转换为彩色?

问题描述:

我想在GDIPAPI单元中使用MakeColor方法,但从intbyte的转换没有返回正确的值。如何将ARGB值从字符串转换为彩色?

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; 

我在做什么错?

+1

两件事。首先,你的结果类型应该是什么?其次,不应该把第一个Copy调用说成1,而不是0,作为第一个参数? – 2010-04-22 14:06:34

+0

另外,GDIAPI从哪里来?我的Delphi 2010安装中没有该单元。 – 2010-04-22 14:12:16

+0

@Mason,我提到'MakeColor'方法在GDIPAPI单元中是它的一部分GDI + ...返回类型是一个TValue。 – James 2010-04-22 14:14:03

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

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

的类型转换是需要抑制的范围检查错误,每当alpha分量是大于127你会得到; StrToInt返回一个有符号整数,但ARGB是一个无符号类型。

+0

@Rob,更棒!如果我只有RBG,那么呢?我只是将'ff'附加到字符串? – James 2010-04-22 14:54:59

+0

我想你的意思是写'StrToInt',而不是'IntToStr'。 – 2010-04-22 18:42:08

+0

是的。或者,如果你想确保你可能获得的任何颜色都是完全的,那么这个:'Result:= AlphaMask或ARGB(StrToInt('$'+ argbStr));'' – 2010-04-22 18:56:41

A, R, G, B的类型更改为Integer似乎解决了该问题。它必须与Integer - > Byte之间的投射有关。