5

.NETで画像のサイズを変更しようとしていますが、サイズ変更された画像の周囲にかすかな黒い境界線が表示されます。投稿を見つけました-http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/cf765094-c8c1-4991-a1f3-cecdbd07ee15/これは、宛先の長方形をキャンバスよりも大きくすると言った人からのものですうまくいきましたが、これは私にはうまくいきません。上と左の境界線はなくなりますが、右と下はまだそこにあり、完全な1pxの厚さの黒です。

私は何かが足りないのですか?私のコードは以下の通りです。

Image image = ... // this is a valid image loaded from the source
Rectangle srcRectangle = new Rectangle(0,0,width, height);
        Size croppedFullSize = new Size(width+3,height+3);
        Rectangle destRect = new Rectangle(new Point(-1,-1), croppedFullSize);
        using(Bitmap newImage = new Bitmap(croppedFullSize.Width, croppedFullSize.Height, format))
        using(Graphics Canvas = Graphics.FromImage(newImage)) {
            Canvas.SmoothingMode = SmoothingMode.AntiAlias;
            Canvas.InterpolationMode = InterpolationMode.HighQualityBicubic;
            Canvas.PixelOffsetMode = PixelOffsetMode.HighQuality;
            Canvas.FillRectangle(Brushes.Transparent, destRect);
            Canvas.DrawImage(image, destRect, srcRectangle, GraphicsUnit.Pixel);


            newImage.Save(filename, image.RawFormat);
        }
4

3 に答える 3

13

WrapModeがTileFlipXYに設定されているImageAttributesインスタンスをDrawImageメソッドに指定するだけです。これにより、エッジが背景色と混ざり合うのを防ぎます。

ここでの他の回答のようにメモリをリークしないサンプルコードについては、この要点を参照してください

于 2012-08-07T17:20:29.227 に答える
3

このように試してみてください、私は黒い境界線を持ったことがないと思います...

System.Drawingライブラリを使用する場合:

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の方法をお勧めします。圧縮と品質はより良いようです...

于 2011-03-28T00:29:52.287 に答える
2

私にとって、それは悪いビットマップパラメータでした。これの代わりに:

new Bitmap(width, height, PixelFormat.Format32bppPArgb);

PixelFormatを次のように削除するだけです。

new Bitmap(width, height);

そして、すべてがその時大丈夫でした。

PixelFormatでは、上下の境界線に黒い境界線がありました。次に、g.PixelOffsetMode=PixelOffsetMode.HighQuality;を試しました。最初は問題ないようでした。しかし、その後、画像全体の周りに薄い灰色の境界線があることに気づきました。

于 2017-02-13T20:36:52.190 に答える