自定义几种颜色表示某种含义如(0,128,16)这种颜色表示高兴,(2,156,255)表示悲伤,但当我把这种颜色RGB(0,128,16)画到画布上保存再取出

  • 主题发起人 主题发起人 美国提子
  • 开始时间 开始时间

美国提子

Unregistered / Unconfirmed
GUEST, unregistred user!
自定义几种颜色表示某种含义如(0,128,16)这种颜色表示高兴,(2,156,255)表示悲伤,但当我把这种颜色RGB(0,128,16)画到画布上保存再取出颜色的时候,r,g,b改变了 (100分)<br />因为需要通过r,g,b值找出对应的含义,有什么办法能让r,g,b不改变(256色)
 
先计算出62个字节的像素位置,再用循环使用Pixels方法方法,对每个像素取色.
 
经测试,颜色确实会变。关注!
我的测试方法:
procedure TForm1.Button2Click(Sender: TObject);
var
i,j :integer;
Red, Green, Blue :Integer;
DispColor :TColor;
begin
Red:=StrToInt(Edit1.Text);
Green:=StrToInt(Edit2.Text);
Blue:=StrToInt(Edit3.Text);
DispColor:=Red + Green shl 8 + Blue shl 16;
Edit7.Text:=IntToStr(DispColor);
for i:=-5 to 5 do
for j:=-5 to 5 do
Canvas.Pixels[50+i,50+j]:=DispColor;//RGB(0, 128, 16);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
Red, Green, Blue :Integer;
DispColor :TColor;
begin
DispColor :=Canvas.Pixels[50,50];
Edit8.Text:=IntToStr(DispColor);
Red := DispColor and $FF;
Green := (DispColor and $FF00) shr 8;
Blue := (DispColor and $FF0000) shr 16;
Edit4.Text:=IntToStr(Red);
Edit5.Text:=IntToStr(Green);
Edit6.Text:=IntToStr(Blue);
end;
 
可能是图片的颜色问题吧,BITMAP的图片要用16位位图,你的用的是不是256色的啊
 
iamy:我用的是256色
 
用16位色就应该正确了
 
呵呵,我程序需要用256色的
 
非常有意思,愿意知道答案.
我测试的结果和提子的一样:
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
DispColor :TColor;
begin
//测试
dispcolor:=$9;
showmessage(inttostr(dispcolor));
for i:=-5 to 5 do
for j:=-5 to 5 do
Canvas.Pixels[50+i,50+j]:=DispColor;//RGB(0, 128, 16);
DispColor :=Canvas.Pixels[50,50];
showmessage(inttostr(dispcolor));

end;
怀疑是256色的关系?是不是用16色显示就可以解决问题?
 
成功了.呵呵,交费:)
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
DispColor :TColor;
begin
//测试
dispcolor:=$9;
showmessage(inttostr(dispcolor));
for i:=-5 to 5 do
for j:=-5 to 5 do
Image1.Canvas.Pixels[20+i,20+j]:=DispColor;//RGB(0, 128, 16);
DispColor :=Image1.Canvas.Pixels[20,20];
showmessage(inttostr(dispcolor));
需要说明一下:Image1.picture的图片一定要256的就可以了.(不要用jpg,用bmp的图片).

 
楼上不行啊,呵呵你dispcolor取大点的值在试试
我的是256的图片。会不会是这样,当我画一个颜色到画布上的时候,系统自动查找调色板中最近似该颜色的值
 
顶顶!和我的问题差不多
 
我用256色的图片试了试,发现在canvas上取的rgb的值与源文件里的值不同,这是怎么回事?
 
呵呵,经过测试发现不能用image1.Canvas.Pixels[x,y];的方法取象素值,要用scanline的办法才不会出错。

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
k:integer;
row:pbytearray;
begin
row:=image1.Picture.Bitmap.ScanLine [y];
k:=row[x];
form1.Caption :=inttostr(k);
end;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部