Delphi で画像を適切に拡大縮小しますか?
-
21-09-2019 - |
解決
Win32 API 呼び出しの使用に戻す場合は、次を使用できます。 SetStretchBltMode ハーフトーンにして使用します ストレッチブルート. 。これがデフォルトの Delphi 呼び出しを使用して提供されるかどうかはわかりませんが、一般的にはこの問題を解決する方法です。
アップデート (2014-09) ちょうど今、私は同様の状況にあり、TScrollBox に TImage があり、フォーム上でさらに多くのことが行われており、本当に欲しかった Image1.Stretch:=true;
ハーフトーンを行うため。ロブが指摘するように、 TBitmap.Draw
ハーフトーンを使用します のみ 宛先キャンバスが 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;
他のヒント
あなたの本当に、本当にしたいを使用するには 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;
あなたは、画像を再サンプリング時に選択するいくつかの方法とフィルタを持っています。使用上の例(素晴らしい結果とちょっと遅いが、)カーネルリサンプラとランチョスのフィルタ再構築カーネルなど。上記の例では、あなたのために働く必要があります。
あなたはGraphUtil
から内蔵のデルファイScaleImage試みることができます私はGDIPOB.pasのTGPGraphicsクラスを使用します。
キャンバスTGPGraphicsある場合、は、境界は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;
とsmootingモード:
SmoothingModeDefault = QualityModeDefault;
SmoothingModeHighSpeed = QualityModeLow;
SmoothingModeHighQuality = QualityModeHigh;
SmoothingModeNone = 3;
SmoothingModeAntiAlias = 4;
注:これはXP以降またはインストーラでいるgdiplus.dllをbundeling必要になります。