请问彩色灰度转换错误…………(100分)

  • 主题发起人 主题发起人 SuperLunatic
  • 开始时间 开始时间
S

SuperLunatic

Unregistered / Unconfirmed
GUEST, unregistred user!
var
Gray : byte;
begin
Gray := Round((0.30 * GetRValue(RGBColor)) +
(0.59 * GetGValue(RGBColor)) +
(0.11 * GetBValue(RGBColor )));
这样编译连警告都没有!!运行则 Raised exception class ERangeError with
message 'Range check erroe'!我已经把 Compiler中的 Range cheching取消了还不行!
不用Round,用 Gray := HiByte(……);还是一样的错误!
请教各位大峡…………
谢谢!!
 
你把Gray换为另一种类型试试,换为Extended可以吗,我就是用这种类型。
 
很简单:Gray : Integer;
 
Extended,Integer都不行,也许是我这里不行,好多书上讲灰度都是用Interger,再加
HiByte(……)的。我这里编译连警告都没有!一转化就说出界....
 
procedure TForm1.Button1Click(Sender: TObject);
var
Gray : byte;
rgbcolor:tcolor;
begin
rgbcolor:=clred;
Gray := Round((0.30 * GetRValue(RGBColor)) +
(0.59 * GetGValue(RGBColor)) +
(0.11 * GetBValue(RGBColor )));
showmessage(inttostr(gray));
end;

我运行了,出来个76,什么错误都没有。
按照规定,round是int64的类型,但短的会截断的
我打开range check和关掉都没什么影响。
是你的rgbcolor有问题吧
 
我单步执行也还可以啊,什么异常都没有,一 go 就在停在那里了。
不过我用scanline + shr解决了,另外速度还很快,呵呵……

谢谢大家!!
huasoft 20
hug 30
stlont 50
 
这样可以的,
var
Gray : Extended;
begin
Gray := (0.30 * GetRValue(RGBColor) +
(0.59 * GetGValue(RGBColor) +
(0.11 * GetBValue(RGBColor );
 
后退
顶部