.Net - граница вокруг размеров
Вопрос
Я пытаюсь изменить размер изображения в .NET, но получить слабую черную границу вокруг измененного изображения.Я нашел сообщение - http://social.msdn.microsoft.com/forums/en-us/csharpgeneral/Thrad/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);
}
. Решение
Попробуйте это так, я думаю, у меня никогда не было черной границы ...
Если вы хотите использовать 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 Way.Сжатие и качество кажется лучше ...
Другие советы
Просто укажите метод drawmage с экземпляром ImageAttribute, который имеет Wrapmode, установленный на Tileflipxy.Это предотвратит смешивание к краю на фоне фона.
Для образца кода, который не утекает память, как другие ответы здесь, Смотрите этот глоток
.Для меня это был плохой растровый параметр.Вместо этого:
new Bitmap(width, height, PixelFormat.Format32bppPArgb);
.
Просто удалите Pixelformat к этому:
new Bitmap(width, height);
.
и все было в порядке, то тогда.
с Pixelformat у меня была черная граница на верхней и левой границе.Затем я попробовал g.cixelOffsetmode= pixeloffsetmode.highquality;который казался в порядке сначала.Но потом я заметил светло-серые границы по всему образу.