一点分请笑纳!! (20分)

  • 主题发起人 主题发起人 hug
  • 开始时间 开始时间
H

hug

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一下代码,为什么结果不一样?即gray和gray1不一样!请帮忙!
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
temp,emp : Tcolor;
gray,gray1 : Extended;
rr,rr1,gg1,bb1,gg,bb : byte;
p : pByteArray;
pp : integer;
begin
temp:= Image1.Canvas.Pixels[x,y];
rr := getRvalue(temp); {分解红色分量}
gg := getGvalue(temp); {分解绿色分量}
bb := getBvalue(temp); {分解蓝色分量}
Gray:= 0.3*rr+0.59*gg+0.11*bb;
p:=Image1.Picture.Bitmap.ScanLine[image1.Picture.Bitmap.Height-y-1];
emp:=p[x];
rr1 := getRvalue(emp); {分解红色分量}
gg1 := getGvalue(emp); {分解绿色分量}
bb1 := getBvalue(emp); {分解蓝色分量}
Gray1:= 0.3*rr1+0.59*gg1+0.11*bb1;
showmessage(floattostr(gray)+' '+floattostr(gray1));
edit1.Color:=temp;
edit2.Color:=emp;
end;

end.
 
因为 p 是指向 byte 的,你的 gg1 和 bb1 永远为0
pp[x] 应该是调色板中的索引,不是真正的颜色。
 
你的位图是8bit的,所以你可以这么做:
rr1:=p[x+2];//红色分量
gg1:=p[x+1];//绿色分量
bb1:=p[x];//蓝色分量
Gray1:= 0.3*rr1+0.59*gg1+0.11*bb1;
 
to huazai :还是不行,能帮我调调吗?谢谢!!
 
这样可以了:

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
temp, emp: Tcolor;
gray, gray1: Extended;
rr, rr1, gg1, bb1, gg, bb: byte;
p: pByteArray;

begin

temp := Image1.Picture.Bitmap.Canvas.Pixels[x, y];
rr := getRvalue(temp); {·Ö½âºìÉ«·ÖÁ¿}
gg := getGvalue(temp); {·Ö½âÂÌÉ«·ÖÁ¿}
bb := getBvalue(temp); {·Ö½âÀ¶É«·ÖÁ¿}
Gray := 0.3 * rr + 0.59 * gg + 0.11 * bb;
image1.Picture.Bitmap.PixelFormat := pf24bit;
p := Image1.Picture.Bitmap.ScanLine[ y ];
rr1 := p[3*x+2 ]; //ºìÉ«·ÖÁ¿
gg1 := p[x*3+1]; //ÂÌÉ«·ÖÁ¿
bb1 := p[x*3]; //À¶É«·ÖÁ¿
emp:=rgb(rr1,gg1,bb1);
Gray1 := 0.3 * rr1 + 0.59 * gg1 + 0.11 * bb1;
showmessage(floattostr(gray) + ' ' + floattostr(gray1));
edit1.Color := temp;
edit2.Color := emp;
end;
 
应该从调色板中找颜色
 
谢谢你们!!
 
后退
顶部