.NET - サイズ変更されたサイズの中の境界線
質問
.NETで画像をサイズ変更しようとしていますが、サイズ変更された画像の周囲にかすかな黒い境界線を入手してください。 http.://social.msdn.microsoft.com/forums/en-us/csharpgeneral/thread/cf765094-C8C1-4991-a1f3-cecdbd07ee15/ キャンバスよりも大きい目的の長方形を大きくすると言った人は、しかし、これは私のためにうまくいきません。それは上面と左の境界線のridを得ますが、右下はまだそこにあり、厚さ1pxの黒です。
解決
このように試してみて、私は黒い境界線を持っていないと思います...
System.Drawing Librariesを使用したい場合:
using (var sourceBmp = new Bitmap(sourcePath))
{
decimal aspect = (decimal)sourceBmp.Width / (decimal)sourceBmp.Height;
int newHeight = (int)(newWidth / aspect);
using (var destinationBmp = new Bitmap(newWidth, newHeight))
{
using (var destinationGfx = Graphics.FromImage(destinationBmp))
{
destinationGfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
destinationGfx.DrawImage(sourceBmp, new Rectangle(0, 0, destinationBmp.Width, destinationBmp.Height));
destinationBmp.Save(destinationPath, ImageFormat.Jpeg);
}
}
}
.
またはあなたはこのようにWPFと同じことができます:
using (var output = new FileStream(outputPath, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.None))
{
var imageDecoder = BitmapDecoder.Create(inputStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None);
var imageFrame = imageDecoder.Frames[0];
decimal aspect = (decimal)imageFrame.Width / (decimal)imageFrame.Height;
var height = (int)(newWidth / aspect);
var imageResized = new TransformedBitmap(imageFrame,new ScaleTransform(
newWidth / imageFrame.Width * Dpi / imageFrame.DpiX,
height / imageFrame.Height * Dpi / imageFrame.DpiY, 0, 0));
var targetFrame = BitmapFrame.Create(imageResized);
var targetEncoder = new JpegBitmapEncoder();
targetEncoder.Frames.Add(targetFrame);
targetEncoder.QualityLevel = 80;
targetEncoder.Save(output);
}
.
WPFの方法をお勧めします。圧縮と品質が良くなるようです...
他のヒント
は、LAPMODEをTILEFLIPXYに設定したImageAttributesインスタンスを使用してDrailImageメソッドを提供します。これにより、エッジが背景色とブレンドされるのを防ぎます。
ここで他の回答のようなメモリを漏洩しないサンプルコードは、このgist
私にとっては悪いビットマップパラメータでした。この代わりに:
new Bitmap(width, height, PixelFormat.Format32bppPArgb);
.
これにピクセルフォーマットを削除するだけです。
new Bitmap(width, height);
.
とすべてが大丈夫でした。 PIXERFORMATでは、上下の境界線に黒い境界がありました。それから私はg.pixeloffsetmode= pixelOffsetmode.highqualityを試しました。最初はうまくいった。しかし、それから私は画像全体の周りに薄い境界線に気づいた。