Можно ли сгладить масштабированный TBitmap в Delphi? - PullRequest
5 голосов
/ 07 мая 2010

Я использую Stretched = True для TImage с растровым изображением 256x256. Это уменьшается на 1,2,4 или 8. Как и ожидалось, текст на растровом изображении становится тем ужаснее, чем больше я отклоняюсь от «1». Однако я заметил, что проводник Windows 7 делает уменьшенную версию растрового изображения «более мягкой» и более приятной. Можно ли таким образом «размыть» TBitmap?

Ответы [ 2 ]

9 голосов
/ 08 мая 2010

Используя HALFTONE StretchBltMode, вы получите более плавные результаты, чем при обычном растягивании.Это будет работать только в Windows 2000 и более поздних версиях

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;
8 голосов
/ 07 мая 2010

Полагаю, вы имеете в виду Stretched = True для TImage, а не для TBitmap.

К сожалению, в TImage нет встроенных ресэмплеров, когда дело доходит до изменения размера изображений в нем. Я бы рекомендовал использовать Graphics32 , так как он поддерживает различные ресемплеры (некоторые лучше для увеличения размера, другие для уменьшения размера)

...