我的代码如下:
//面板Panel的Resize函数,Image放在此Panel上的,Image的大小随Panel改变而改变
procedure Tfrm_main.PanelResize(Sender: TObject);
var
BackBitmap: TBitmap;
begin
BackBitmap := TBitmap.Create;
try
BackBitmap.Assign(Image1.Picture.Bitmap); // 先将原来画的东西保存起来
Image1.Picture.Graphic := nil; //清除原来的内容,否则没法改变大小。
Image1.Width := Panel.Width;
Image1.Height := Panel.Height;
Image1.Canvas.Draw(0, 0, BackBitmap); // 再把原图画回去
finally
BackBitmap.Free;
end;
end;但是当Panel的大小改变后,尤其是被缩小后,Image中已画的图形会被Panel的边框擦除掉,请问应该怎么解决这个问题?
//面板Panel的Resize函数,Image放在此Panel上的,Image的大小随Panel改变而改变
procedure Tfrm_main.PanelResize(Sender: TObject);
var
BackBitmap: TBitmap;
begin
BackBitmap := TBitmap.Create;
try
BackBitmap.Assign(Image1.Picture.Bitmap); // 先将原来画的东西保存起来
Image1.Picture.Graphic := nil; //清除原来的内容,否则没法改变大小。
Image1.Width := Panel.Width;
Image1.Height := Panel.Height;
Image1.Canvas.Draw(0, 0, BackBitmap); // 再把原图画回去
finally
BackBitmap.Free;
end;
end;但是当Panel的大小改变后,尤其是被缩小后,Image中已画的图形会被Panel的边框擦除掉,请问应该怎么解决这个问题?
你把Image.Stretch设置成为True试试呢?不用你的PanelResize事件!
begin
Image1.Width := Panel.Width;
Image1.Height := Panel.Height;
end;
这样有什么问题吗?你需要怎么显示?
Image1.Canvas.CopyRect(Rect(0, 0, Bitmap.Width, Bitmap.Height),
Bitmap.Canvas,
Rect(0, 0, Bitmap.Width, Bitmap.Height));
image1.Proportional:=True; //关键是这句,属性窗里没有
image1.Picture.LoadFromFile(Imagefn);
妥了。
你可能没有理解我的意思
你把Image.Stretch设置成为True试试呢?不用你的PanelResize事件!把Image.Stretch设置成为True后,再在Image上面画图,比例就不对了。=========================================================================Image1.Stretch:=True;
image1.Proportional:=True; //关键是这句,属性窗里没有 ->“比例就对了”
image1.Picture.LoadFromFile(Imagefn);
妥了。难道我理解的不对吗?
你就是想放一个Image在Panel上,然后随着Panel的大小而变Image的大小,而且要保持Image的比例,不对吗?
绘制图形时,实际绘制到该Bitmap上。当需要显示时,将该Bitmap转换成一个与Image大小一样的Bitmap进行显示。转换时如果只是用Api Stretch绘制,如果是缩小,会有线条丢失,如果是放大会有矩齿。使用下面的函数进行转换可以失真较少procedure Stretch_Linear(bmpDest: TBitmap; bmpSrc: TBitmap);
var
sw: integer;
sh: integer;
dw: integer;
dh: integer;
B, N, x, y: integer;
pLinePrev, pLineNext: PByte;
pDest: PByte;
pA, pB, pC, pD: PByte;
nPixelSize: integer;
i, j, k: integer;
BxN, dwXdh, dhB, dwN: integer;
dwXdh_dhB_dwN: integer;
begin
if (bmpDest.PixelFormat <> pf24bit)
or (bmpSrc.PixelFormat <> pf24bit) then
Exit; sw := bmpSrc.Width - 1;
sh := bmpSrc.Height - 1;
dw := bmpDest.Width - 1;
dh := bmpDest.Height - 1; nPixelSize := 3; for i := 0 to dh do
begin pDest := bmpDest.ScanLine[i]; y := i * sh div dh; N := dh - i * sh mod dh; pLinePrev := bmpSrc.ScanLine[y];
Inc(y);
if ( N = dh ) then
pLineNext := pLinePrev
else
pLineNext := bmpSrc.ScanLine[y]; for j := 0 to dw do
begin x := j * sw div dw * nPixelSize; B := dw - j * sw mod dw; pA := pLinePrev;
Inc(pA, x); pB := pA;
Inc(pB, nPixelSize); pC := pLineNext;
Inc(pC, x); pD := pC;
Inc(pD, nPixelSize); if ( B = dw ) then
begin
pB := pA;
pD := pC;
end;
BxN := B * N;
dwXdh := dw * dh;
dhB := dh * B;
dwN := dw *N;
dwXdh_dhB_dwN := dwXdh - dhB - dwN;
for k := 0 to nPixelSize-1 do
begin
pDest^ := ( BxN * ( pA^ - pB^ - pC^ + pD^ ) + dwN * pB^
+ dhB * pC^ + ( dwXdh_dhB_dwN ) * pD^
+ dwXdh shr 1 ) div ( dwXdh );
Inc(pA);
Inc(pB);
Inc(pC);
Inc(pD);
Inc(pDest);
end;
end
end;
end;注意: 输入输出的Bitmap必须是pf24bit格式