高质量图像缩放库

此问题不符合堆栈溢出准则。它当前不接受答案。


更新问题,使其成为Stack Overflow

的主题。

5年前关闭。

我想以与Photoshop一样好的质量等级在C#中缩放图像。是否有任何C#图像处理库可用于执行此操作?

回答:

这是一个经过很好评论的“图像处理”帮助器类,您可以查看和使用。我将其作为如何在C#中执行某些图像处理任务的示例进行了编写。您将对

函数感兴趣,该函数采用System.Drawing.Image,宽度和高度作为参数。

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Drawing.Imaging;

namespace DoctaJonez.Drawing.Imaging

{

/// <summary>

/// Provides various image untilities, such as high quality resizing and the ability to save a JPEG.

/// </summary>

public static class ImageUtilities

{

/// <summary>

/// A quick lookup for getting image encoders

/// </summary>

private static Dictionary<string, ImageCodecInfo> encoders = null;

/// <summary>

/// A lock to prevent concurrency issues loading the encoders.

/// </summary>

private static object encodersLock = new object();

/// <summary>

/// A quick lookup for getting image encoders

/// </summary>

public static Dictionary<string, ImageCodecInfo> Encoders

{

//get accessor that creates the dictionary on demand

get

{

//if the quick lookup isn't initialised, initialise it

if (encoders == null)

{

//protect against concurrency issues

lock (encodersLock)

{

//check again, we might not have been the first person to acquire the lock (see the double checked lock pattern)

if (encoders == null)

{

encoders = new Dictionary<string, ImageCodecInfo>();

//get all the codecs

foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageEncoders())

{

//add each codec to the quick lookup

encoders.Add(codec.MimeType.ToLower(), codec);

}

}

}

}

//return the lookup

return encoders;

}

}

/// <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 System.Drawing.Bitmap ResizeImage(System.Drawing.Image image, int width, int height)

{

//a holder for the result

Bitmap result = new Bitmap(width, height);

//set the resolutions the same to avoid cropping due to resolution differences

result.SetResolution(image.HorizontalResolution, image.VerticalResolution);

//use a graphics object to draw the resized image into the bitmap

using (Graphics graphics = Graphics.FromImage(result))

{

//set the resize quality modes to high quality

graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;

graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

//draw the image into the target bitmap

graphics.DrawImage(image, 0, 0, result.Width, result.Height);

}

//return the resulting bitmap

return result;

}

/// <summary>

/// Saves an image as a jpeg image, with the given quality

/// </summary>

/// <param name="path">Path to which the image would be saved.</param>

/// <param name="quality">An integer from 0 to 100, with 100 being the

/// highest quality</param>

/// <exception cref="ArgumentOutOfRangeException">

/// An invalid value was entered for image quality.

/// </exception>

public static void SaveJpeg(string path, Image image, int quality)

{

//ensure the quality is within the correct range

if ((quality < 0) || (quality > 100))

{

//create the error message

string error = string.Format("Jpeg image quality must be between 0 and 100, with 100 being the highest quality. A value of {0} was specified.", quality);

//throw a helpful exception

throw new ArgumentOutOfRangeException(error);

}

//create an encoder parameter for the image quality

EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);

//get the jpeg codec

ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");

//create a collection of all parameters that we will pass to the encoder

EncoderParameters encoderParams = new EncoderParameters(1);

//set the quality parameter for the codec

encoderParams.Param[0] = qualityParam;

//save the image using the codec and the parameters

image.Save(path, jpegCodec, encoderParams);

}

/// <summary>

/// Returns the image codec with the given mime type

/// </summary>

public static ImageCodecInfo GetEncoderInfo(string mimeType)

{

//do a case insensitive search for the mime type

string lookupKey = mimeType.ToLower();

//the codec to return, default to null

ImageCodecInfo foundCodec = null;

//if we have the encoder, get it to return

if (Encoders.ContainsKey(lookupKey))

{

//pull the codec from the lookup

foundCodec = Encoders[lookupKey];

}

return foundCodec;

}

}

}


更新资料

一些人一直在评论中询问如何使用ImageUtilities类的示例,因此您可以开始使用。

//resize the image to the specified height and width

using (var resized = ImageUtilities.ResizeImage(image, 50, 100))

{

//save the resized image as a jpeg with a quality of 90

ImageUtilities.SaveJpeg(@"C:\myimage.jpeg", resized, 90);

}

回答:

请记住,图像是一次性的,因此您需要将调整大小的结果分配给using声明(或者您可以尝试使用try并确保您在finally中调用dispose)。

以上是 高质量图像缩放库 的全部内容, 来源链接: utcz.com/qa/399134.html

回到顶部