Size
,Width
和Height
是Get()
的System.Drawing.Image
属性; 如何在运行时在C#中调整Image对象的大小?
现在,我正在使用以下方法创建新的
Image
: // objImage is the original Image
Bitmap objBitmap = new Bitmap(objImage, new Size(227, 171));
#1 楼
这将执行高质量的调整大小:/// <summary>
/// Resize the image to the specified width and height.
/// </summary>
/// <param name="image">The image to resize.</param>
/// <param name="width">The width to resize to.</param>
/// <param name="height">The height to resize to.</param>
/// <returns>The resized image.</returns>
public static Bitmap ResizeImage(Image image, int width, int height)
{
var destRect = new Rectangle(0, 0, width, height);
var destImage = new Bitmap(width, height);
destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
using (var graphics = Graphics.FromImage(destImage))
{
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using (var wrapMode = new ImageAttributes())
{
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
graphics.DrawImage(image, destRect, 0, 0, image.Width,image.Height, GraphicsUnit.Pixel, wrapMode);
}
}
return destImage;
}
wrapMode.SetWrapMode(WrapMode.TileFlipXY)
防止图像边界周围出现重影-单纯的调整大小将对超出像素的透明像素进行采样图像边界,但是通过镜像图像,我们可以获得更好的样本(此设置非常引人注目)destImage.SetResolution
不管物理尺寸如何都保持DPI -在减小图像尺寸或打印时可以提高质量合成控制像素如何与背景融合-可能不需要,因为我们只绘制一件事。
graphics.CompositingMode
确定源图像中的像素是否覆盖或与背景像素组合。 SourceCopy
指定在渲染颜色时会覆盖背景颜色。graphics.CompositingQuality
确定分层图像的渲染质量级别。graphics.InterpolationMode
确定如何计算两个端点之间的中间值graphics.SmoothingMode
指定线条,曲线和填充区域的边缘是否使用平滑(也称为抗锯齿)-可能仅适用于矢量graphics.PixelOffsetMode
会在绘制新图像时影响渲染质量保持纵横比作为练习是读者的一项工作(实际上,我只是认为为您做到这一点不是此功能的工作)。
另外,这是一篇很好的文章,描述了图像大小调整的一些陷阱。上面的功能将覆盖其中的大多数功能,但是您仍然需要担心保存问题。
评论
调整图像大小时,代码可以完美工作,但大小从66KB增加到132KB。我可以减少I头吗
–恰马拉
2014年10月31日下午5:48
@chamara这可能是由于您选择的保存质量。请参阅msdn.microsoft.com/zh-cn/library/bb882583(v=vs.110).aspx尝试quality = 90
– mpen
2014年10月31日在17:11
@kstubs您确定是。位图本质上只是类的名称,您可以将其保存为所需的任何文件类型。
– mpen
16年6月10日在20:33
@dotNetBlackBelt您可能需要添加对System.Drawing的引用,并使用System.Drawing.Imaging进行添加;
– mpen
17年5月30日在17:21
这样会不会保持原来的长宽比吧?
–卡斯珀·斯科夫(Kasper Skov)
18年7月19日在8:00
#2 楼
不确定这样做有什么困难,请执行您的工作,使用重载的Bitmap构造函数创建一个重新调整大小的图像,您唯一缺少的就是将其强制转换回Image数据类型:public static Image resizeImage(Image imgToResize, Size size)
{
return (Image)(new Bitmap(imgToResize, size));
}
yourImage = resizeImage(yourImage, new Size(50,50));
评论
您不应该在将yourImage分配给新图像之前对其进行处置?
–尼克·肖
14年7月16日在13:56
您可以手动处理它,也可以让垃圾收集器完成它的工作。不管。
– Elmue
2014年9月23日下午16:58
此代码无法控制大小调整的质量,这非常重要。看一下马克的答案。
– Elmue
2014-09-23 18:14
@Elmue垃圾收集器不会自动清除远程GDI +对象。处置它们至关重要。
– Nyerguds
7月29日8:26
@Elmue这真是个坏建议,你在说什么。我从事影像处理工作已有8年的历史,涉及扫描软件,数百万个文档和页面的批量转换以及OCR等,并且不处理位图,除非在最琐碎的情况下会造成内存泄漏,效率低下的代码以及会停顿下来(崩溃,性能下降等)。当您不需要任何东西时,您应该始终总是尽快通知GC,这样GC以后就不必做太多工作了,这实际上会影响应用程序的性能和可伸缩性(在很大程度上)
–大卫·安德森(David Anderson)
8月31日20:33
#3 楼
在这个问题中,您将得到一些答案,包括我的:public Image resizeImage(int newWidth, int newHeight, string stPhotoPath)
{
Image imgPhoto = Image.FromFile(stPhotoPath);
int sourceWidth = imgPhoto.Width;
int sourceHeight = imgPhoto.Height;
//Consider vertical pics
if (sourceWidth < sourceHeight)
{
int buff = newWidth;
newWidth = newHeight;
newHeight = buff;
}
int sourceX = 0, sourceY = 0, destX = 0, destY = 0;
float nPercent = 0, nPercentW = 0, nPercentH = 0;
nPercentW = ((float)newWidth / (float)sourceWidth);
nPercentH = ((float)newHeight / (float)sourceHeight);
if (nPercentH < nPercentW)
{
nPercent = nPercentH;
destX = System.Convert.ToInt16((newWidth -
(sourceWidth * nPercent)) / 2);
}
else
{
nPercent = nPercentW;
destY = System.Convert.ToInt16((newHeight -
(sourceHeight * nPercent)) / 2);
}
int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);
Bitmap bmPhoto = new Bitmap(newWidth, newHeight,
PixelFormat.Format24bppRgb);
bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
imgPhoto.VerticalResolution);
Graphics grPhoto = Graphics.FromImage(bmPhoto);
grPhoto.Clear(Color.Black);
grPhoto.InterpolationMode =
System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
grPhoto.DrawImage(imgPhoto,
new Rectangle(destX, destY, destWidth, destHeight),
new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
GraphicsUnit.Pixel);
grPhoto.Dispose();
imgPhoto.Dispose();
return bmPhoto;
}
评论
您忘记了imgPhoto.Dispose();文件保持使用状态
–shrutyzet
13年4月17日在8:39
这非常有帮助,我正在我的应用程序中使用它。但是,需要注意的重要一点是,该算法不适用于透明图像。它将所有透明像素变为黑色。它可能很容易修复,但只是给用户的提示。 :)
– Meme
16年5月3日在8:56
您不是要保存图像吗? imgPhoto.Save()吗?
–鞭打
16年11月29日在16:31
@meme您能否提供有关如何修复透明文档的黑色背景的链接。
–赛义德·穆罕默德(Syed Mohamed)
17/12/28在10:54
我的背景色有很多边框出血。使用Math.Ceiling对destWidth和destHeight有所帮助,但还不够。但是,此存储性能在Azure上比其他解决方案更好。
–野蛮人
9月16日18:50
#4 楼
为什么不使用System.Drawing.Image.GetThumbnailImage
方法?public Image GetThumbnailImage(
int thumbWidth,
int thumbHeight,
Image.GetThumbnailImageAbort callback,
IntPtr callbackData)
示例:
Image originalImage = System.Drawing.Image.FromStream(inputStream, true, true);
Image resizedImage = originalImage.GetThumbnailImage(newWidth, (newWidth * originalImage.Height) / originalWidth, null, IntPtr.Zero);
resizedImage.Save(imagePath, ImageFormat.Png);
来源:
http ://msdn.microsoft.com/zh-CN/library/system.drawing.image.getthumbnailimage.aspx
评论
这不是调整图像大小的正确方法。如果存在,则会从jpg中提取缩略图。如果不存在,则无法控制质量或新图像。另外,此代码本身也会发生内存泄漏。
–罗伯特·史密斯
2014年6月20日20:43在
@Bobrot为什么这会导致内存泄漏?
–用户
14年7月14日在22:40
GDI库中的所有内容仍在不受管理的状态下运行。如果不使用using语句或事后不处理这些对象,则系统可能需要很长时间才能对这些对象进行垃圾回收,并使内存再次可用。
–罗伯特·史密斯
2014年7月18日在9:17
就像您说的那样:可能需要很长时间。但这不是内存泄漏。如果永远不会释放内存,那将是内存泄漏。但这是垃圾收集器的正常行为,即当CPU空闲时它释放内存。 using()语句不能防止内存泄漏。它只是立即释放内存,而垃圾收集器在有时间这样做时释放内存。这是此特定情况下的唯一区别。
– Elmue
2014年9月23日在16:52
请参阅调整图像大小的陷阱:nathanaeljones.com/blog/2009/20-image-resizing-pitfalls“使用GetThumbnailImage()。GetThumbnailImage()似乎是显而易见的选择,许多文章建议使用它。不幸的是,它总是抓住嵌入式jpeg如果有缩略图,则有些照片有这些缩略图,有些则没有-通常取决于您的相机。您会想知道为什么GetThumbnailImage在某些照片上效果很好,但在另一些照片上却模糊不清。GetThumbnailImage()对于较大的照片不可靠因此,比10px x 10px。”
–尼克画家
17年8月17日在21:49
#5 楼
您可以尝试net-vips,这是libvips的C#绑定。这是一个懒惰的,按需驱动的,流媒体驱动的图像处理库,因此它无需加载整个图像就可以执行这样的操作。例如,它带有一个方便的图像缩略图: Image image = Image.Thumbnail("image.jpg", 300, 300);
image.WriteToFile("my-thumbnail.jpg");
它还支持智能裁剪,这是一种智能确定图像最重要部分的方法,裁切图像时使其聚焦。例如:
Image image = Image.Thumbnail("owl.jpg", 128, crop: "attention");
image.WriteToFile("tn_owl.jpg");
其中
owl.jpg
是偏心构图:给出以下结果:
首先将图像缩小以使垂直轴达到128像素,然后裁剪使用
attention
策略可将像素缩小到128个像素。此图片在图像中搜索可能引起人眼注意的功能,有关详细信息,请参阅Smartcrop()
。评论
您对libvips的绑定似乎很棒。我一定会看看你的lib。感谢您将其提供给C#Developer!
– FrenchTastic
19年3月14日在10:17
太好了!我不知道图像处理库看起来会这么好。
– dalvir
19年7月21日在2:11
真好!比ImageMagick更好
– Moshe L
5月6日20:12
对不起,如果我的问题很愚蠢。我在“ Image.Thumbnail”中的Thumbnail部分下以及image.WriteToFile的WriteToFile部分下得到了一个红色下划线。我可能会问“正在使用...;我应该使用什么?”我知道使用NetVips是其中之一。
–格雷格伯特
10月12日20:39
@Gregbert使用NetVips;应该做的工作。您是否安装了NuGet软件包?如果这不起作用,请在NetVips问题跟踪器上打开一个新问题:github.com/kleisauke/net-vips/issues
– kleisauke
10月13日15:15
#6 楼
public static Image resizeImage(Image image, int new_height, int new_width)
{
Bitmap new_image = new Bitmap(new_width, new_height);
Graphics g = Graphics.FromImage((Image)new_image );
g.InterpolationMode = InterpolationMode.High;
g.DrawImage(image, 0, 0, new_width, new_height);
return new_image;
}
评论
您忘记了处理图形。似乎与具有更好插值模式的新Bitmap(图像,宽度,高度)相同的原理。我很好奇什么是默认值?比低差还差吗?
– Sinatr
19年1月10日在13:58
#7 楼
-无需循环即可调整宽度和高度的大小
不超过图像的原始尺寸
////// /////////
private void ResizeImage(Image img, double maxWidth, double maxHeight)
{
double resizeWidth = img.Source.Width;
double resizeHeight = img.Source.Height;
double aspect = resizeWidth / resizeHeight;
if (resizeWidth > maxWidth)
{
resizeWidth = maxWidth;
resizeHeight = resizeWidth / aspect;
}
if (resizeHeight > maxHeight)
{
aspect = resizeWidth / resizeHeight;
resizeHeight = maxHeight;
resizeWidth = resizeHeight * aspect;
}
img.Width = resizeWidth;
img.Height = resizeHeight;
}
评论
OP询问有关System.Drawing.Image的问题,由于无法设置'Width'和'Height'属性,因此您的代码无法使用。但是,它将适用于System.Windows.Controls.Image。
– mmmdreg
13年8月23日在9:42
#8 楼
此代码与以上答案之一发布的代码相同。.但是,它将透明像素转换为白色而不是黑色...谢谢:) public Image resizeImage(int newWidth, int newHeight, string stPhotoPath)
{
Image imgPhoto = Image.FromFile(stPhotoPath);
int sourceWidth = imgPhoto.Width;
int sourceHeight = imgPhoto.Height;
//Consider vertical pics
if (sourceWidth < sourceHeight)
{
int buff = newWidth;
newWidth = newHeight;
newHeight = buff;
}
int sourceX = 0, sourceY = 0, destX = 0, destY = 0;
float nPercent = 0, nPercentW = 0, nPercentH = 0;
nPercentW = ((float)newWidth / (float)sourceWidth);
nPercentH = ((float)newHeight / (float)sourceHeight);
if (nPercentH < nPercentW)
{
nPercent = nPercentH;
destX = System.Convert.ToInt16((newWidth -
(sourceWidth * nPercent)) / 2);
}
else
{
nPercent = nPercentW;
destY = System.Convert.ToInt16((newHeight -
(sourceHeight * nPercent)) / 2);
}
int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);
Bitmap bmPhoto = new Bitmap(newWidth, newHeight,
PixelFormat.Format24bppRgb);
bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
imgPhoto.VerticalResolution);
Graphics grPhoto = Graphics.FromImage(bmPhoto);
grPhoto.Clear(Color.White);
grPhoto.InterpolationMode =
System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
grPhoto.DrawImage(imgPhoto,
new Rectangle(destX, destY, destWidth, destHeight),
new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
GraphicsUnit.Pixel);
grPhoto.Dispose();
imgPhoto.Dispose();
return bmPhoto;
}
#9 楼
在应用程序中,我创建了一个具有多个选项的函数。它很大,但是可以调整图像的大小,可以保持宽高比,可以切割边缘以仅返回图像的中心:/// <summary>
/// Resize image with a directory as source
/// </summary>
/// <param name="OriginalFileLocation">Image location</param>
/// <param name="heigth">new height</param>
/// <param name="width">new width</param>
/// <param name="keepAspectRatio">keep the aspect ratio</param>
/// <param name="getCenter">return the center bit of the image</param>
/// <returns>image with new dimentions</returns>
public Image resizeImageFromFile(String OriginalFileLocation, int heigth, int width, Boolean keepAspectRatio, Boolean getCenter)
{
int newheigth = heigth;
System.Drawing.Image FullsizeImage = System.Drawing.Image.FromFile(OriginalFileLocation);
// Prevent using images internal thumbnail
FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
FullsizeImage.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
if (keepAspectRatio || getCenter)
{
int bmpY = 0;
double resize = (double)FullsizeImage.Width / (double)width;//get the resize vector
if (getCenter)
{
bmpY = (int)((FullsizeImage.Height - (heigth * resize)) / 2);// gives the Y value of the part that will be cut off, to show only the part in the center
Rectangle section = new Rectangle(new Point(0, bmpY), new Size(FullsizeImage.Width, (int)(heigth * resize)));// create the section to cut of the original image
//System.Console.WriteLine("the section that will be cut off: " + section.Size.ToString() + " the Y value is minimized by: " + bmpY);
Bitmap orImg = new Bitmap((Bitmap)FullsizeImage);//for the correct effect convert image to bitmap.
FullsizeImage.Dispose();//clear the original image
using (Bitmap tempImg = new Bitmap(section.Width, section.Height))
{
Graphics cutImg = Graphics.FromImage(tempImg);// set the file to save the new image to.
cutImg.DrawImage(orImg, 0, 0, section, GraphicsUnit.Pixel);// cut the image and save it to tempImg
FullsizeImage = tempImg;//save the tempImg as FullsizeImage for resizing later
orImg.Dispose();
cutImg.Dispose();
return FullsizeImage.GetThumbnailImage(width, heigth, null, IntPtr.Zero);
}
}
else newheigth = (int)(FullsizeImage.Height / resize);// set the new heigth of the current image
}//return the image resized to the given heigth and width
return FullsizeImage.GetThumbnailImage(width, newheigth, null, IntPtr.Zero);
}
要制作它更容易访问该函数,可以添加一些重载的函数:
/// <summary>
/// Resize image with a directory as source
/// </summary>
/// <param name="OriginalFileLocation">Image location</param>
/// <param name="heigth">new height</param>
/// <param name="width">new width</param>
/// <returns>image with new dimentions</returns>
public Image resizeImageFromFile(String OriginalFileLocation, int heigth, int width)
{
return resizeImageFromFile(OriginalFileLocation, heigth, width, false, false);
}
/// <summary>
/// Resize image with a directory as source
/// </summary>
/// <param name="OriginalFileLocation">Image location</param>
/// <param name="heigth">new height</param>
/// <param name="width">new width</param>
/// <param name="keepAspectRatio">keep the aspect ratio</param>
/// <returns>image with new dimentions</returns>
public Image resizeImageFromFile(String OriginalFileLocation, int heigth, int width, Boolean keepAspectRatio)
{
return resizeImageFromFile(OriginalFileLocation, heigth, width, keepAspectRatio, false);
}
现在是设置的最后两个布尔值。
调用此函数:
System.Drawing.Image ResizedImage = resizeImageFromFile(imageLocation, 800, 400, true, true);
#10 楼
这是我为特定要求而设计的代码,即:目的地始终为风景比例。它应该给您一个良好的开始。public Image ResizeImage(Image source, RectangleF destinationBounds)
{
RectangleF sourceBounds = new RectangleF(0.0f,0.0f,(float)source.Width, (float)source.Height);
RectangleF scaleBounds = new RectangleF();
Image destinationImage = new Bitmap((int)destinationBounds.Width, (int)destinationBounds.Height);
Graphics graph = Graphics.FromImage(destinationImage);
graph.InterpolationMode =
System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
// Fill with background color
graph.FillRectangle(new SolidBrush(System.Drawing.Color.White), destinationBounds);
float resizeRatio, sourceRatio;
float scaleWidth, scaleHeight;
sourceRatio = (float)source.Width / (float)source.Height;
if (sourceRatio >= 1.0f)
{
//landscape
resizeRatio = destinationBounds.Width / sourceBounds.Width;
scaleWidth = destinationBounds.Width;
scaleHeight = sourceBounds.Height * resizeRatio;
float trimValue = destinationBounds.Height - scaleHeight;
graph.DrawImage(source, 0, (trimValue / 2), destinationBounds.Width, scaleHeight);
}
else
{
//portrait
resizeRatio = destinationBounds.Height/sourceBounds.Height;
scaleWidth = sourceBounds.Width * resizeRatio;
scaleHeight = destinationBounds.Height;
float trimValue = destinationBounds.Width - scaleWidth;
graph.DrawImage(source, (trimValue / 2), 0, scaleWidth, destinationBounds.Height);
}
return destinationImage;
}
评论
太棒了!!!我在人像图片方面遇到麻烦,在尝试了许多在网络上寻求的解决方案后,这才是完美的!非常感谢!
–法比奥
16 Jul 15'2:01
#11 楼
public string CreateThumbnail(int maxWidth, int maxHeight, string path)
{
var image = System.Drawing.Image.FromFile(path);
var ratioX = (double)maxWidth / image.Width;
var ratioY = (double)maxHeight / image.Height;
var ratio = Math.Min(ratioX, ratioY);
var newWidth = (int)(image.Width * ratio);
var newHeight = (int)(image.Height * ratio);
var newImage = new Bitmap(newWidth, newHeight);
Graphics thumbGraph = Graphics.FromImage(newImage);
thumbGraph.CompositingQuality = CompositingQuality.HighQuality;
thumbGraph.SmoothingMode = SmoothingMode.HighQuality;
//thumbGraph.InterpolationMode = InterpolationMode.HighQualityBicubic;
thumbGraph.DrawImage(image, 0, 0, newWidth, newHeight);
image.Dispose();
string fileRelativePath = "newsizeimages/" + maxWidth + Path.GetFileName(path);
newImage.Save(Server.MapPath(fileRelativePath), newImage.RawFormat);
return fileRelativePath;
}
单击此处http://bhupendrasinghsaini.blogspot.in/2014/07/resize-image-in-c.html
#12 楼
如果您使用的是BitmapSource
:var resizedBitmap = new TransformedBitmap(
bitmapSource,
new ScaleTransform(scaleX, scaleY));
如果要更好地控制质量,请先运行此命令:
RenderOptions.SetBitmapScalingMode(
bitmapSource,
BitmapScalingMode.HighQuality);
(默认值为
BitmapScalingMode.Linear
,等效于BitmapScalingMode.LowQuality
。)#13 楼
我之所以使用ImageProcessorCore,主要是因为它可以运行.Net Core。它具有更多选项,例如转换类型,裁剪图像等等。
http:// imageprocessor.org/imageprocessor/
评论
我看了一下,它不支持.NET Core。它是基于完整框架构建的。
–chrisdrobison
'18 -10-1在18:37
#14 楼
您可以为此使用Accord.NET框架。它提供了几种不同的大小调整方法:双三次
双线性
最近的邻居
#15 楼
调整大小并保存图像以适合宽度和高度,例如画布,保持图像成比例using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
namespace Infra.Files
{
public static class GenerateThumb
{
/// <summary>
/// Resize and save an image to fit under width and height like a canvas keeping things proportional
/// </summary>
/// <param name="originalImagePath"></param>
/// <param name="thumbImagePath"></param>
/// <param name="newWidth"></param>
/// <param name="newHeight"></param>
public static void GenerateThumbImage(string originalImagePath, string thumbImagePath, int newWidth, int newHeight)
{
Bitmap srcBmp = new Bitmap(originalImagePath);
float ratio = 1;
float minSize = Math.Min(newHeight, newHeight);
if (srcBmp.Width > srcBmp.Height)
{
ratio = minSize / (float)srcBmp.Width;
}
else
{
ratio = minSize / (float)srcBmp.Height;
}
SizeF newSize = new SizeF(srcBmp.Width * ratio, srcBmp.Height * ratio);
Bitmap target = new Bitmap((int)newSize.Width, (int)newSize.Height);
using (Graphics graphics = Graphics.FromImage(target))
{
graphics.CompositingQuality = CompositingQuality.HighSpeed;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.DrawImage(srcBmp, 0, 0, newSize.Width, newSize.Height);
using (MemoryStream memoryStream = new MemoryStream())
{
target.Save(thumbImagePath);
}
}
}
}
}
#16 楼
将以下功能与以下示例配合使用以更改图像大小://Example :
System.Net.Mime.MediaTypeNames.Image newImage = System.Net.Mime.MediaTypeNames.Image.FromFile("SampImag.jpg");
System.Net.Mime.MediaTypeNames.Image temImag = FormatImage(newImage, 100, 100);
//image size modification unction
public static System.Net.Mime.MediaTypeNames.Image FormatImage(System.Net.Mime.MediaTypeNames.Image img, int outputWidth, int outputHeight)
{
Bitmap outputImage = null;
Graphics graphics = null;
try
{
outputImage = new Bitmap(outputWidth, outputHeight, System.Drawing.Imaging.PixelFormat.Format16bppRgb555);
graphics = Graphics.FromImage(outputImage);
graphics.DrawImage(img, new Rectangle(0, 0, outputWidth, outputHeight),
new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel);
return outputImage;
}
catch (Exception ex)
{
return img;
}
}
评论
请考虑在上面的答案中解释如何使用此代码,该代码的作用以及如何解决原始问题中的问题。
– TimVisée
18年1月17日在9:58
我还添加了用例。结合以下示例使用上述功能。图片newImage = Image.FromFile(“ SampImag.jpg”);图像temImag = FormatImage(newImage,100,100);
– Prasad KM
18年5月10日在9:52
#17 楼
注意:这不适用于ASP.Net Core,因为WebImage依赖于System.Web,但是依赖于ASP.Net的早期版本,我多次使用了此代码段,并且很有用。String ThumbfullPath = Path.GetFileNameWithoutExtension(file.FileName) + "80x80.jpg";
var ThumbfullPath2 = Path.Combine(ThumbfullPath, fileThumb);
using (MemoryStream stream = new MemoryStream(System.IO.File.ReadAllBytes(fullPath)))
{
var thumbnail = new WebImage(stream).Resize(80, 80);
thumbnail.Save(ThumbfullPath2, "jpg");
}
评论
不正确的方法...使用低质量的插值,并且可能会在新的位图图像的持续时间内导致原始流保持锁定状态...在执行自己的图像大小调整解决方案之前,请阅读图像大小调整陷阱列表。处理! using(){}有效!
如果这些答案有帮助,请考虑标记接受的答案。
无需使用任何其他库。马克在下面发布的代码效果很好。
马克是谁?我找不到他的答案,但有3条评论指的是它。