Mettre une image à L'échelle à Delphes?

J'utilise Delphi 2009 et j'aimerais adapter une image à l'espace disponible. l'image s'affiche toujours plus petite que l'originale. le problème est que la propriété TImage Stretch ne fait pas un bon travail et nuit à la lisibilité de l'image.

<!--3 http://xrw.bc.ca/download/so/TImageStretch.gif

je voudrais le voir mis à l'échelle comme ceci à la place:

plus agréable http://xrw.bc.ca/download/so/NicerTImageStretch.png

des suggestions sur la meilleure façon de procéder? JVCL a essayé, mais il ne semble pas avoir cette capacité. Une bibliothèque gratuite serait bien, mais peut-être qu'il y a une bibliothèque à faible coût qui fait "seulement" ce serait bien aussi.

14
demandé sur Juha Syrjälä 2009-12-29 21:30:02

4 réponses

si vous revenez à L'utilisation des appels D'API Win32, vous pouvez utiliser Setretchbltmode à HALFTONE et à utiliser StretchBlt. Je ne suis pas sûr que cela soit fourni en utilisant les appels Delphi par défaut, mais c'est la façon dont je résous généralement ce problème.

mise à Jour (2014-09) a L'instant j'étais dans une situation similaire (encore) et j'avais un chronomètre dans une boite avec beaucoup plus de choses à faire sur le formulaire, et je voulais vraiment Image1.Stretch:=true; pour faire demi-teinte. Comme Rob le fait remarquer,TBitmap.Draw utilise En demi-teintes lorsque la toile de destination est de 8 bits par pixel ou moins et que la toile source en a plus... Donc je l'ai' corrigé ' en assignant Image1.Picture.Bitmap pour l'une de ces à la place:

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;
14
répondu Stijn Sanders 2014-09-26 08:33:07

Vous vraiment, vraiment envie utiliser Graphics32.

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;

Vous avez plusieurs méthodes et Filtres à choisir lors du rééchantillonnage d'une image. L'exemple ci-dessus utilise un rééchantillonneur de noyau (un peu lent, mais avec de bons résultats) et un Lanczos filtrer en tant que noyau de reconstruction. L'exemple ci-dessus devrait fonctionner pour vous.

32
répondu Leonardo Herrera 2018-02-27 15:59:53

vous pouvez essayer le ScaleImage Delphi intégré de GraphUtil

6
répondu David 2009-12-30 08:11:33

j'utilise GDIPOB.classe TGPGraphics de pas!--4-->

si Canvas est TGPGraphics, Bounds est TGPRectF et NewImage est tgpimage instance:

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

vous pouvez choisir le facteur qualité VS vitesse en changeant le mode interpolation

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

et le mode de lissage:

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

NOTE: cela nécessiterait XP ou plus tard ou l'empaquetage du gdiplus.dll dans votre installateur.

3
répondu Ivelin Nikolaev 2010-01-01 10:22:15