请教Image1和Image2完全重叠或Image1的属性Visible为False时如何得到Image1的颜色(或RGB值)(50分)

  • 主题发起人 主题发起人 jackhzdwzg
  • 开始时间 开始时间
J

jackhzdwzg

Unregistered / Unconfirmed
GUEST, unregistred user!
Form1上有两个Image:Image1和Image2(Image1和Image2大小相同),点击Image2时要求得到Image1的颜色(或RGB值)。
当Image1和Image2位置不重叠且Image1的属性Visible为Ture时我可以得到Image1的颜色(或RGB值)。
现在的情况是这样的:我只想看到Image2,即Image1放在Image2的下面(Image1和Image2完全重叠)或Image1的属性Visible为False时我就得不到Image1的颜色(或RGB值)。请教高手:此时如何得到Image1的颜色(或RGB值)(我是菜鸟最好能有代码)?!若分数不够可以再加。多谢!!
 
你将Image1转化为24bit的BMP图,用相对位置来计算在ScanLine中取值。
 
笨方法,不知行不行:
新建Form2,把Image1放在Form2中。
点击Image2时,创建Form2并置入 Form1下(隐藏),获取RGB后再Form2.Close
 
我看对你有用
procedure TForm1.Button1Click(Sender: TObject);
var
Bmp1,Bmp2 :TBitmap;
begin
Bmp1 :=TBitmap.Create;
Bmp1.LoadFromFile('F:/图象/BMP2/[0004].bmp');
Bmp2 :=TBitmap.Create;
Bmp2.LoadFromFile('F:/图象/BMP2/[0011].bmp');
//逻辑与:用SRCAND;逻辑或:用SRCPAINT
BitBlt(Bmp1.Canvas.Handle,0,0,Bmp1.Width,Bmp1.Height,Bmp2.Canvas.Handle,0,0,SRCPAINT);
Image1.Picture.Bitmap.Assign(Bmp1);
Bmp1.Free;
Bmp2.Free;
end;
 
to:TYZhang,
你说出了解决问题的思路,我是菜鸟,我不知怎样将Image1转化为24bit的BMP图,再用相对位置来计算在ScanLine中取值,你能再说具体些吗(最好能有代码)?分数可以再加。
 
可以如下,(其他格式也许也可,试一下)记得加入 use jpeg.
var

MyJpeg: TJpegImage;

Image1: TImage;

begin

Image1:= TImage.Create(self);

MyJpeg:= TJpegImage.Create;

Image1.Picture.Bitmap.LoadFromFile('c:.BMP'); // Load the Bitmap from a file

MyJpeg.Assign(Image1.Picture.Bitmap); // Assign the BitMap to MyJpeg object

MyJpeg.CompressionQuality:=StrToInt('75');

MyJpeg.Compress;

MyJpeg.SaveToFile('c:.JPG'); // Save the JPEG to Disk

end;

var

MyJpeg: TJpegImage;

bmp: Tbitmap;

begin

bmp:=tbitmap.Create;

MyJpeg:= TJpegImage.Create;

myjpeg.LoadFromFile('c:.jpg');

bmp.Assign(myjpeg);

bmp.SaveToFile('c:.bmp'); // Save the JPEG to Disk

end;

**************************************************************************

///Bitmap 和 JPEG 格式间的快速转换

function Bmp2Jpg(Bmp: TBitmap; Quality: Integer = 100): TJpegImage;

begin

Result := nil;

if Assigned(Bmp)

then begin

Result := TJpegImage.Create;

Result.Assign(Bmp); {It′s all folks...}

Result.CompressionQuality := Quality;

Result.JPEGNeeded; {Key method...}

Result.Compress;

end;

end;

function Jpg2Bmp(Jpg: TJpegImage): TBitmap;

begin

Result := nil;

if Assigned(Jpg)

then begin

Result := TBitmap.Create;

Jpg.DIBNeeded; {Key method...}

Result.Assign(Jpg); {It′s all folks...}

end;

end;

 
是某一点的颜色?对不?
如果你的image 不是 visible的, 将 image的图片copy到 bitmap 上,
如果image1和image2的位置,大小完全一样,更容易,连坐标也不用转换。
canvas.Pixels[X, Y: Integer] 就可以得到RGB值
 
var
myarr : array of array of Integer; //定义动态数组
i, j : Integer;
list:Tstrings;
begin
list:=Tstringlist.Create;
SetLength(myarr, Image1.Width + 1, Image1.Height + 1);
for i := Image1.Left to Image1.Width + Image1.Left do
for j := Image1.Top to Image1.Height + Image1.Top do
begin
myarr[i, j] := ColorToRGB(Image1.Canvas.Pixels[i, j]);
list.add(IntToStr(myarr[i, j])+'|');
end;
list.SaveToFile('f:/abc.txt');
end;
 
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var BT:TBitMap;
P : PByteArray;
R,G,B:Integer;
begin
if Assigned(Image1.Picture.Graphic) then
begin
BT:=TBitmap.Create;
try
BT.Assign(Image1.Picture.Graphic);
Image1.Picture.Bitmap.Assign(BT);
finally
BT.Free;
end;
end;
Image1.Picture.Bitmap.PixelFormat:=pf24bit;
P:=Image1.Picture.Bitmap.ScanLine[Y];
R:=P[X*3];
G:=P[X*3+1];
B:=P[X*3+2];
ShowMessage(Format('R:=%d,G=%d,B=%d',[R,G,B]));
end;
 
采用xuxiaohan方法也行:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var BT:TBitMap;
R,G,B:Integer;
K:TCOlor;
begin
if Assigned(Image1.Picture.Graphic) then
begin
BT:=TBitmap.Create;
try
BT.Assign(Image1.Picture.Graphic);
Image1.Picture.Bitmap.Assign(BT);
finally
BT.Free;
end;
end;
K:=Image1.Picture.Bitmap.Canvas.Pixels[X,Y];
R:=(K shr 16) and $FF;
G:=(K shr 8) and $FF;
B:=K and $FF;
ShowMessage(Format('R:=%d,G=%d,B=%d',[R,G,B]));
end;
 
谢谢大家的热心帮助!!我准备结贴给分。
to:TYZhang,
我有一疑问想再请教您:我用您的方法得到的RGB值和用(GetRValue,GetGValue,GetBValue)得到的RGB值稍有不同,如果将得到的R值和B值对调后两者的结果就完全相同。还有,得到了RGB值如何转成实际颜色呢?多谢!!
 
我刚才试了一下,我取得值R与B反了。
Color:=StringToColor(Format('$00%s%s%s',[IntToHex(B and $FF,2),IntToHex(G and $FF,2),IntToHex(R and $FF,2)]));
 
再次谢谢大家!!我用TYZhang的方法已解决我的问题。我好开心。祝大家开心每一天!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
637
import
I
后退
顶部