在线程里直接用IMAGE来COPYRECT可以,用TBITMAP怎么就不行了呢!!!???(50分)

  • 主题发起人 主题发起人 logpie
  • 开始时间 开始时间
L

logpie

Unregistered / Unconfirmed
GUEST, unregistred user!
我这有一个186X111的图象,我把他分成6块,没快31*111大
放在6个线程里分别 COPYRECT
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Image2: TImage;
BitBtn1: TBitBtn;
Memo1: TMemo;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Type
TMythread=class(Tthread)
private
newstr:string;
protected
procedure Execute;override;
procedure ChangeCap;
Public
constructor Create(ns:string);
end;
var
Form1: TForm1;
MyRect:Trect;
Trdlst:TLIST;
CS:TRTLCriticalSection;
implementation
{$R *.dfm}
constructor TMythread.Create(ns:string);
begin
newstr:=ns;
inherited create(false);
end;

procedure Tmythread.Execute ;
var i,j:integer;
str:string;
begin
FreeonTerminate :=true;
EnterCriticalSection(CS);
if newstr= '1' then
begin
with Myrectdo
begin
top:=0;
left:=0;
right:=31;
bottom:=form1.Image1.Height;
end;
end;
if newstr='2' then
begin
with Myrectdo
begin
top:=0;
left:=31;
right:=62;
bottom:=form1.Image1.Height;
end;
end;
if newstr='3'then
begin
with Myrectdo
begin
top:=0;
left:=62;
right:=93;
bottom:=form1.Image1.Height;
end;
end;
if newstr='4' then
begin
with Myrectdo
begin
top:=0;
left:=93;
right:=124;
bottom:=form1.Image1.Height;
end;
end;
if newstr='5' then
begin
with Myrectdo
begin
top:=0;
left:=124;
right:=155;
bottom:=form1.Image1.Height;
end;
end;
if newstr='6' then
begin
with Myrectdo
begin
top:=0;
left:=155;
right:=186;
bottom:=form1.Image1.Height;
end;

end;
synchronize(ChangeCap);
LeaveCriticalSection(CS);
end;
procedure TMythread.ChangeCap ;
begin
form1.image2.Canvas.CopyRect(Myrect,form1.image1.Picture.Bitmap.Canvas,Myrect);---------------------(*)
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var i:integer;
begin
TrdLst:=TList.Create ;
InitializeCriticalsection(CS);
for i:=1 to 6do
TrdLst.Add(TMythread.Create(inttostr(i)));
end;
end.

上面代码运行正常,IMAGE2里分块出现了IMAGE1的图象。
但是如果我不用IMAGE2来COPYRECT,而用一个TBITMAP来COPYRECT,那么这个TBITMAP居然是空的
比如:
var
Form1: TForm1;
MyRect:Trect;
Trdlst:TLIST;
CS:TRTLCriticalSection;
bmp1:Tbitmap;
implementation
...
...
...
if newstr='6' then
begin
with Myrectdo
begin
top:=0;
left:=155;
right:=186;
bottom:=form1.Image1.Height;
end;

end;
bmp1.Canvas.CopyRect(Myrect,form1.image1.Picture.Bitmap.Canvas,Myrect);
bmp1.SaveToFile('f:/a1.bmp');
synchronize(ChangeCap);
LeaveCriticalSection(CS);
end;
...
...
end.
照理说A1。BMP因该是被分成的第6块图象,可实际上A1。BMP什么也没有,0字节大小
这是怎么回事?
 
2天了~一个回复也没有!!!~哎~
UUUUUUUUUUUUUUUUUUUUUUUUUUUUUPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
 
你要先设置bitmap的高和宽!
bmp1.Width:=myRect.Right;
bmp1.Height:=myRect.Bottom;
再就可以了,
 
我没有回贴的原因是你写代码的风格实在惨不忍睹,无法看完这个代码我的眼睛就趴下
了。建议养成良好的代码风格。什么是标准风格,可以看:
http://www.chancestudio.com/Concept/Wealth/doc/Delphi%B1%E0%C2%EB%B9%E6%B7%B6.doc
http://www.5xsoft.com/data/200201/1808452901.htm
想偷懒,就使用 DelForExp 专家控件,它自动为你完成标准代码格式排列,下载:
http://www.dow.wau.nl/aew/DelForExp.html
 
你的代码我没时间看了,以前我写过一个以流的形式保存的,没有设置position := 0
结果保存成的图片是空的,0字节
 
这样的代码实在看不下去.
 
晕~因为设置MYRECT,所以才会看起来长~
测试用的,所以马虎写了~呵呵
 
Dot NND ,MYRECT 需要如你这般设置吗 ?一个 TRect 就需要这样,10 个 100 个 TRect 你怎么办?
你这叫“马虎写”吗?越是马虎写就应该越简单。Rect(a,b,c,d) 一句就够了。
 

Similar threads

I
回复
0
查看
709
import
I
I
回复
0
查看
612
import
I
I
回复
0
查看
516
import
I
I
回复
0
查看
875
import
I
后退
顶部