bitmap的assign问题(100分)

  • 主题发起人 whether_bobo
  • 开始时间
W

whether_bobo

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TFrmMain.DrawImage;
var
BitMap:TBitmap;
P : PByteArray;
i,j:integer;
x1,x2,y1,y2:integer;
begin
ImageView.Canvas.Lock;
BitMap := TBitMap.create;
BitMap.Width:=ImageView.Width;
BitMap.Height:=ImageView.Height;
BitMap.PixelFormat := pf24bit;
BitMap.Canvas.Pen.Mode := pmCopy;
BitMap.Canvas.Brush.Color:=clWhite;
BitMap.Canvas.FillRect(Rect(0,0,BitMap.Width,BitMap.Height));
if ImageSource.Picture.Bitmap.PixelFormat<>pf24bit then
ImageSource.Picture.Bitmap.PixelFormat:=pf24bit;
for i:=TopLeftPoint.y to BottomRightPoint.y do
for j:=TopLeftPoint.x to BottomRightPoint.x do
begin
P := ImageSource.Picture.Bitmap.Scanline;
BitMap.Canvas.Brush.Color:=RGB(P[j*3+2],P[j*3+1],P[j*3]);
//以下是算出显示的位置,不会出错
x1:=(j-TopLeftPoint.x)*ZoomSize;
x2:=(j-TopLeftPoint.x+1)*ZoomSize;
y1:=(i-TopLeftPoint.y)*ZoomSize;
y2:=(i-TopLeftPoint.y+1)*ZoomSize;
BitMap.Canvas.FillRect(Rect(x1,y1,x2,y2));
end;
ImageView.Picture.Bitmap.Assign(BitMap);
// ImageTemp.Picture.Bitmap.Assign(ImageView.Picture.Bitmap);
BitMap.free;
ImageView.Canvas.Unlock;
end;
如果不加入注释掉的那一行,只能第一次显示正确,改变源图像,显示图像不改变了
如果加入那一行,就可以正确显示
为什么?
 
assign是将指针指向对象,你把被指向的对象释放掉了,所以就不能正确显示的.
 
Assign是复制,并不是引用.
所以使用Assign 后,改变源,不会改变目标.
 
可能我没说清楚,我所说的‘改变源图像’是指ImageSource中的图像后,重新执行此过程
 
是不是没有刷新呀,你在画完后调用一下canvas.refresh试一下.
 
refresh没有用
 
我试了一下,在你引掉的地方加入
ImageView.Repaint;就可以了.
 
to l213
我的情况和你不一样,我的源图像没有改变,我只是改变了放大倍数,重画不能解决问题
不过我自己找到解决方法了
我在注释处改为BitMap.FreeImage;就可以了,但是还是不知道原理
可能是当图像没有改变Assign仍然采用原来的内存中的图像
附上Delphi帮助中的例子
----------------------------
procedure TForm1.Button1Click(Sender: TObject);

var
BitMap1,BitMap2 : TBitMap;
MyFormat : Word;
begin
BitMap2 := TBitMap.Create;
BitMap1 := TBitMap.Create;
try
BitMap1.LoadFromFile('c:/Program Files/common Files/Borland Shared/Images/Splash/256color/factory.bmp');
BitMap2.Assign(BitMap1); // Copy BitMap1 into BitMap2
BitMap2.Dormant; // Free up GDI resources
BitMap2.FreeImage; // Free up Memory.
Canvas.Draw(20,20,BitMap2); // Note that previous calls don't lose the image

BitMap2.Monochrome := true;
Canvas.Draw(80,80,BitMap2);
BitMap2.ReleaseHandle; // This will actually lose the bitmap;
finally
BitMap1.Free;
BitMap2.Free;
end;
end;
 
[red]问题自己解决了,但是不知道怎么收回分数,各位大侠不用麻烦回答了,问题结束[/red]
 
顶部