Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET-已调整大小的图像周围的边框_C#_.net_Graphics_Drawing2d - Fatal编程技术网

C# .NET-已调整大小的图像周围的边框

C# .NET-已调整大小的图像周围的边框,c#,.net,graphics,drawing2d,C#,.net,Graphics,Drawing2d,我试图在.NET中调整图像的大小,但在调整大小后的图像周围有一个模糊的黑色边框。我发现了一篇帖子——有人说,让目标矩形比画布大是可行的,但这对我来说不可行。它获得了顶部和左侧边界的riid,但右侧和底部仍然存在,并且是一个1像素厚的黑色 我错过什么了吗?我的代码如下 Image image = ... // this is a valid image loaded from the source Rectangle srcRectangle = new Rectangle(0,0,width,

我试图在.NET中调整图像的大小,但在调整大小后的图像周围有一个模糊的黑色边框。我发现了一篇帖子——有人说,让目标矩形比画布大是可行的,但这对我来说不可行。它获得了顶部和左侧边界的riid,但右侧和底部仍然存在,并且是一个1像素厚的黑色

我错过什么了吗?我的代码如下

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);
        }

像这样试试吧,我想我从来没有黑边框

如果要使用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方式。压缩和质量似乎更好…

只需为DrawImage方法提供一个ImageAttributes实例,该实例的WrapMode设置为TileFlipXY。这将防止边缘与背景色混合


对于不会像这里的其他答案那样泄漏内存的示例代码,

对我来说,这是一个糟糕的位图参数。与此相反:

new Bitmap(width, height, PixelFormat.Format32bppPArgb);
只需将像素格式删除为:

new Bitmap(width, height);
那时一切都很好


对于像素格式,我在顶部和左侧边框上有黑色边框。然后我尝试了g.PixelOffsetMode=PixelOffsetMode.HighQuality;一开始看起来不错。但后来我注意到整个图像周围有浅灰色的边框

我通读了代码,第一个版本与我现在的版本相同(不起作用)。然而,第二种方法确实有效。在ASP.NET项目中添加对PresentationCore和System.Xaml的引用感觉有点脏,但它可以工作,所以为什么不呢……万岁!我只需要从你的代码中提取一行代码,我就解决了我丑陋的边界问题,谢谢!g、 PixelOffsetMode=PixelOffsetMode.HighQuality;TileFlipXY实际上完全解决了这个问题,有两个潜在的原因。您是否尝试过调整灰色图像的大小并将其置于相同的颜色背景下?这对我来说很好,非常简单的方法仅删除此PixelFormat.Format32bppPArgb