質問

Delphi 2009 を使用しており、利用可能なスペースに合わせて画像を拡大縮小したいと考えています。画像は常に元の画像よりも小さく表示されます。問題は、TImage Stretch プロパティがうまく機能せず、画像の可読性を損なうことです。

ugly way
(ソース: xrw.bc.ca)

代わりに次のようにスケーリングしてもらいたいと思います。

nicer way
(ソース: xrw.bc.ca)

これを行う最善の方法はありますか?JVCL を試してみましたが、この機能はないようです。無料のライブラリもいいですが、これ「だけ」を行う低価格のライブラリもあるとよいでしょう。

役に立ちましたか?

解決

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必要になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top