Is it possible to smooth a scaled TBitmap in Delph

2019-04-29 22:46发布

I am using Stretched=True on a TImage with a 256x256 bitmap. This gets scaled down by 1,2,4 or 8. As expected, text on the bitmap gets more horrible the more I depart from '1'. I notice though that Windows 7 explorer renders a scaled down version of the bitmap 'softer' and more pleasing. Is it possible to 'blur' a TBitmap in this way?

2条回答
再贱就再见
2楼-- · 2019-04-29 23:15

I suppose you mean Stretched = True on a TImage, not on A TBitmap.

Unfortunately TImage has no resamplers built in, when it comes to resizing images in it. My recommendation would be to use Graphics32 as it supports a variety of resamplers (some are better for increasing size others for reducing size)

查看更多
看我几分像从前
3楼-- · 2019-04-29 23:16

By using the HALFTONE StretchBltMode, you will get smoother results than the normal stretchdraw. This will only work in windows 2000 and later

procedure SmoothResize();
var pt:TPoint;
    h: HDC;
begin
  h := imgMainPicture.Canvas.Handle;
  // Previous call to StretchDraw
  // imgMainPicture.Canvas.StretchDraw(Rect(0, 0, imgMainPicture.Width - 1,
  // imgMainPicture.Height - 1), curPicture.AnnotatedBitmap);
  // Normal StretchDraw uses STRETCH_DELETESCANS as StretchBltMode , HALFTONE should give better results
  GetBrushOrgEx(h, pt);
  SetStretchBltMode(h, HALFTONE);
  SetBrushOrgEx(h, pt.x, pt.y, @pt);
  StretchBlt(h, 0, 0, imgMainPicture.Width - 1,
    imgMainPicture.Height - 1, curPicture.AnnotatedBitmap.Canvas.Handle,
    0, 0, curPicture.Width,curPicture.Height,SRCCOPY);
end;
查看更多
登录 后发表回答