加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Delphi中很好地缩放图像?

发布时间:2020-12-15 10:05:35 所属栏目:大数据 来源:网络整理
导读:我正在使用Delphi 2009,我想缩放图像以适应可用空间.图像始终显示为小于原始图像.问题是TImage Stretch属性不会做得很好,损害了图片的可读性. ugly way http://xrw.bc.ca/download/so/TImageStretch.gif 我想看到它比较这样: nicer way http://xrw.bc.ca/do
我正在使用Delphi 2009,我想缩放图像以适应可用空间.图像始终显示为小于原始图像.问题是TImage Stretch属性不会做得很好,损害了图片的可读性.

ugly way http://xrw.bc.ca/download/so/TImageStretch.gif

我想看到它比较这样:

nicer way http://xrw.bc.ca/download/so/NicerTImageStretch.png

任何建议如何最好地做到这一点?试过JVCL,但似乎没有这种能力.一个免费的图书馆会很好,但也许有一个低成本的图书馆,“只有”这也将是好的.

解决方法

如果你回到使用Win32 API调用,你可以使用 SetStretchBltMode到HALFTONE并使用 StretchBlt.我不知道这是否使用默认的Delphi调用提供,但这是我通常解决这个问题的方式.

更新(2014-09)刚才我处于类似的情况(又一次),在TScrollBox中有一个TImage,在表单上有更多的事情,真的想要Image1.Stretch:= true;做半色调正如Rob指出的那样,TBitmap.Draw只有当目标画布是每像素8位或更低,源画布更多时才使用HALFTONE …所以我通过将Image1.Picture.Bitmap分配给其中之一来修复它代替:

TBitmapForceHalftone=class(TBitmap)
protected
  procedure Draw(ACanvas: TCanvas; const Rect: TRect); override;
end;

{ TBitmapForceHalftone }

procedure TBitmapForceHalftone.Draw(ACanvas: TCanvas; const Rect: TRect);
var
  p:TPoint;
  dc:HDC;
begin
  //not calling inherited; here!
  dc:=ACanvas.Handle;
  GetBrushOrgEx(dc,p);
  SetStretchBltMode(dc,HALFTONE);
  SetBrushOrgEx(dc,p.x,p.y,@p);
  StretchBlt(dc,Rect.Left,Rect.Top,Rect.Right-Rect.Left,Rect.Bottom-Rect.Top,Canvas.Handle,Width,Height,ACanvas.CopyMode);
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读