如何得到bitmap的rgb值,如何将其实到image中 (100分)

  • 主题发起人 主题发起人 yaoyaoyan78
  • 开始时间 开始时间
Y

yaoyaoyan78

Unregistered / Unconfirmed
GUEST, unregistred user!
1.为什么我这段代码不能在image1上面显示图象;
procedure TForm1.Button1Click(Sender: TObject);
var
sourcedc,DestDC:hdc;
Bhandle:Thandle;
bitmap:Tbitmap;
begin
SourceDC:=getdc(0);
DestDC:=CreateCompatibleDC(SourceDC);
Bhandle:=CreateCompatibleBitmap(SourceDC,200,200);

SelectObject(DestDC,Bhandle);
BitBlt(DestDC,0,0,200,200,SourceDC,
0,0,SRCCOPY);


bitmap:=TBitmap.Create;
bitmap.PixelFormat:=pf24bit;
Bitmap.Handle:=BHandle;
image1.Picture.Bitmap.Height:=200;
image1.Picture.Bitmap.Width:=200;
image1.Picture.Bitmap.Assign(bitmap);

end;
2.为什么 我用bitmap.canvas.pixels[]取它的rgb值,每次得到的都是-1;
盼高手指点
 
/////获取桌面到image1
procedure TForm1.FormCreate(Sender: TObject);
var c:TCanvas;
begin
c:=TCanvas.Create;
c.Handle:=getDC(0);
image1.Canvas.CopyRect(self.Image1.BoundsRect,c,rect(0,0,screen.Width,screen.Height));
c.Free;
end;

///////////////////////////显示颜色值:
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
edit1.Text:=inttohex(image1.canvas.pixels[x,y],6);
end;
 
-1 是因为太大了。
其实那是对的。
 
我的第一个问题是为什么不能在上面显示图象,对不起,标题有点不准确
 
hfghfghfg
我对好多点都取值了,总是得到-1,这肯定不对的
 
procedure TForm1.BitBtn1Click(Sender: TObject);
var
sourcedc, DestDC: hdc;
Bhandle: Thandle;
bitmap: Tbitmap;
c: longword;
begin
SourceDC := getdc(0);
DestDC := CreateCompatibleDC(SourceDC);
Bhandle := CreateCompatibleBitmap(SourceDC, 200, 200);

SelectObject(DestDC, Bhandle);
BitBlt(DestDC, 0, 0, 200, 200, SourceDC,
0, 0, SRCCOPY);

bitmap := TBitmap.Create;
bitmap.PixelFormat := pf24bit;
Bitmap.Handle := BHandle;
image1.Picture.Bitmap.Height := 200;
image1.Picture.Bitmap.Width := 200;
image1.Picture.Bitmap.Assign(bitmap);
c := bitmap.canvas.pixels[1, 1];
showmessage(inttostr(c));
end;
 
-1是对的=$FFFFFFFF
//黑色
 
你试一下
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
color:=-1;
end;
 
这样就行了,不过我看不懂是干什么的,说一下吧!
var
sourcedc,DestDC:hdc;
Bhandle:Thandle;
bitmap:Tbitmap;
begin
SourceDC:=getdc(0);
DestDC:=CreateCompatibleDC(SourceDC);
Bhandle:=CreateCompatibleBitmap(SourceDC,200,200);

SelectObject(DestDC,Bhandle);
BitBlt(DestDC,0,0,200,200,SourceDC,
0,0,SRCCOPY);


bitmap:=TBitmap.Create;
bitmap.PixelFormat:=pf24bit;
Bitmap.Canvas.Handle:=BHandle; ////////////////////
Bitmap.Height:=200; ///////////////
Bitmap.Width:=200; /////////////////

image1.Picture.Bitmap.Assign(bitmap);

end;
 
c: longword;


用longword吧
c := bitmap.canvas.pixels[1, 1];
showmessage(inttostr(c));
 
BitBlt(DestDC,0,0,200,200,SourceDC,
0,0,SRCCOPY);
bitmap:=TBitmap.Create;
bitmap.PixelFormat:=pf24bit;
Bitmap.Handle:=BHandle;
image1.Picture.Bitmap.Height:=200;
image1.Picture.Bitmap.Width:=200;
image1.Picture.Bitmap.Assign(bitmap);
、、、、、、、、、、、、、、、、、、
是有问题的,你应该改为BitBlt(image1.canvas.handle,0,0,200,200,SourceDC,
0,0,SRCCOPY);
该程序之所以出问题,就是因为你根本没有对bitmap赋值,只是声明了它与BHandle
所用的地址空间一样,也就是说,你只是把bitmap指向了BHandle的存储空间,
却没有访问任何数据。
你应该改为BitBlt(image1.canvas.handle,0,0,200,200,SourceDC,
0,0,SRCCOPY);
或者你在Bitmap.Handle:=BHandle;后加一句:
BitBlt(bitmap.handle,0,0,200,200,SourceDC,
0,0,SRCCOPY);才可以。

写完了,真累阿,我要分!!!!




 
这样就行了,好容易才看明白你要干什么!
procedure TForm1.Button1Click(Sender: TObject);
var
sourcedc,DestDC:hdc;
Bhandle:Thandle;
bitmap:Tbitmap;
begin

SourceDC:=getdc(0);
DestDC:=CreateCompatibleDC(SourceDC);
Bhandle:=CreateCompatibleBitmap(SourceDC,200,200);


SelectObject(DestDC,Bhandle);
bitmap:=TBitmap.Create;
//bitmap.PixelFormat:=pf24bit;
Bitmap.Canvas.Handle:=BHandle;
Bitmap.Height:=200;
Bitmap.Width:=200;


BitBlt(Bitmap.Canvas.Handle,0,0,200,200,SourceDC,
0,0,SRCCOPY);


image1.Picture.Bitmap.Assign(bitmap);

end;
 
对wfzha, 我的程序目的就是拷屏,并存到bitmap中,我的程序中bitmap本应该是一个全局变量,以便其他调用,你改过后还是不能正确显示bitamp中的图象
 
我刚才性急写错了一点,楼主之所以错,是因为他把 Bitmap.handle(hBitmap类型)与 Canvas.handle(hdc类型)搞混淆了。而在这一点上,编译器是区分不出来的,他们实际上都是Integer(Cardinal)类型。因此,只需要把Bitmap.Handle:=BHandle;改为Bitmap.Canvas.Handle:=BHandle;就行了。
 
行了!在我这里可以啊!
 
对takashiki
我肯定给bitmap赋值了,因为我在
SelectObject(DestDC,Bhandle);
bitmap:=TBitmap.Create;
//bitmap.PixelFormat:=pf24bit;
Bitmap.Canvas.Handle:=BHandle;
加上:
bitmap.savetofile('a.bmp');
image1.picture.bitmap.loadfromfile('a.bmp');
就能在iamge1上面显示图象了
 
你干脆这样写吧,还简单
var
screenCanvas:TCanvas;
bitmap:Tbitmap;
begin
Screencanvas:=tcanvas.create;
screencanvas.handle:=getdc(hwnd_desktop);
bitmap:=TBitmap.Create;
bitmap.PixelFormat:=pf24bit;
Bitmap.Height:=200;
Bitmap.Width:=200;
bitmap.canvas.copyrect(BITMAP.Canvas.cliprect,
Screencanvas,rect(0,0,200,200));
image1.Picture.Bitmap.Assign(bitmap);
end;
 
对wfzha
你能解释一下你的两段代码有有什么区别吗??
 
我接受wfzha的答案了
不过takashiki也出了力
给wfzha加80分
给takashiki加20分
感谢各位的帮助!!!!!!!!!!!!!!1
 
其实canvas就是对GDI的封装,用screen的hdc做原画布,bitamp作目的画布,初始化好了
直接copy就行了
你的那一段使用的api函数,bitmap的作用只是为image1.picture.bitmap赋值
 
后退
顶部