Я использую Delphi 2009, и я хотел бы масштабировать изображение для установки свободному месту. изображение всегда отображается меньшее, чем оригинал. проблемой является свойство TImage Stretch, не делает хорошего задания и вредит удобочитаемости изображения.
(источник: xrw.bc.ca)
Я хотел бы видеть, что это масштабировалось как это вместо этого:
(источник: xrw.bc.ca)
Какие-либо предложения, как лучше всего сделать это? Попробованный JVCL, но это, кажется, не имеет эту способность. Свободная библиотека была бы хороша, но возможно существует недорогая библиотека, которая делает "только" это было бы хорошо также.
Если вы вернетесь к использованию вызовов 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;
Вы действительно, действительно хотите использовать Графики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. Приведенный выше пример должен сработать для Вас.
.Можно попробовать встроенный Delphi ScaleImage из GraphUtil
.Я использую класс 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 в вашу программу установки.
.