Масштабировать изображение приятно в Delphi?

Я использую Delphi 2009, и я хотел бы масштабировать изображение для установки свободному месту. изображение всегда отображается меньшее, чем оригинал. проблемой является свойство TImage Stretch, не делает хорошего задания и вредит удобочитаемости изображения.

ugly way
(источник: xrw.bc.ca)

Я хотел бы видеть, что это масштабировалось как это вместо этого:

nicer way
(источник: xrw.bc.ca)

Какие-либо предложения, как лучше всего сделать это? Попробованный JVCL, но это, кажется, не имеет эту способность. Свободная библиотека была бы хороша, но возможно существует недорогая библиотека, которая делает "только" это было бы хорошо также.

15
задан Glorfindel 25 May 2019 в 16:04
поделиться

4 ответа

Если вы вернетесь к использованию вызовов Win32 API, вы можете использовать SetStretchBltMode в HALFTONE и использовать StretchBlt. Я не уверен, предоставляется ли это с помощью вызовов Delphi по умолчанию, но именно так я обычно и решаю эту проблему.

Update (2014-09) Просто сейчас я оказался в похожей ситуации (опять) и у меня был TImage в TScrollBox, в форме которого было гораздо больше, и мне очень хотелось Image1.Stretch:=true;, чтобы сделать halftone. Как указывает Роб, TBitmap.Draw использует HALFTONE только , когда холст назначения составляет 8 бит на пиксел или ниже, а холст источника имеет более... Поэтому я 'исправил' его назначением 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,0,0,Width,Height,ACanvas.CopyMode);
end;
16
ответ дан 1 December 2019 в 00:02
поделиться

Вы действительно, действительно хотите использовать Графики32.

procedure DrawSrcToDst(Src, Dst: TBitmap32);
var
  R: TKernelResampler;  
begin
  R := TKernelResampler.Create(Src);
  R.Kernel := TLanczosKernel.Create;
  Dst.Draw(Dst.BoundsRect, Src.BoundsRect, Src);
end;

У Вас есть несколько методов и фильтров для выбора при ресэмплировании изображения. В примере выше в качестве ядра реконструкции используется ресэмплер ядра (немного медленный, но с отличными результатами) и фильтр Lanczos. Приведенный выше пример должен сработать для Вас.

.
32
ответ дан 1 December 2019 в 00:02
поделиться

Можно попробовать встроенный Delphi ScaleImage из GraphUtil

.
9
ответ дан 1 December 2019 в 00:02
поделиться

Я использую класс TGPGraphics GDIPOB.pas

если Canvas это TGPGraphics, Bounds это TGPRectF и NewImage это экземпляр TGPImage:

Canvas.SetInterpolationMode(InterpolationModeHighQualityBicubic);
Canvas.SetSmoothingMode(SmoothingModeHighQuality);
Canvas.DrawImage(NewImage, Bounds, 0, 0, NewImage.GetWidth, NewImage.GetHeight, UnitPixel);

Вы можете выбрать коэффициент скорости VS, изменив режим интерполяции

InterpolationModeDefault             = QualityModeDefault;
InterpolationModeLowQuality          = QualityModeLow;
InterpolationModeHighQuality         = QualityModeHigh;
InterpolationModeBilinear            = 3;
InterpolationModeBicubic             = 4;
InterpolationModeNearestNeighbor     = 5;
InterpolationModeHighQualityBilinear = 6;
InterpolationModeHighQualityBicubic  = 7;

и режим сглаживания:

SmoothingModeDefault     = QualityModeDefault;
SmoothingModeHighSpeed   = QualityModeLow;
SmoothingModeHighQuality = QualityModeHigh;
SmoothingModeNone        = 3;
SmoothingModeAntiAlias   = 4;

ПРИМЕЧАНИЕ: Для этого потребуется XP или более поздняя версия, или объединение gdiplus.dll в вашу программу установки.

.
3
ответ дан 1 December 2019 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: