Photoshop만큼 품질 수준이 높은 C #으로 이미지의 크기를 조정하고 싶습니다. 이 작업을 수행하는 데 사용할 수있는 C # 이미지 처리 라이브러리가 있습니까?
답변
다음은 살펴보고 사용할 수있는 잘 설명 된 이미지 조작 도우미 클래스입니다. C #에서 특정 이미지 조작 작업을 수행하는 방법에 대한 예제로 작성했습니다. System.Drawing.Image, 너비 및 높이를 인수로 사용하는 ResizeImage 함수에 관심이 있습니다 .
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);
}
노트
이미지는 일회용이므로, 크기 조정 결과를 사용 선언에 할당해야합니다. 또는 마지막으로 try를 사용하여 마지막에 dispose를 호출 할 수 있습니다.
답변
GDI +를 사용하여 이미지를 그릴 때 내 의견으로는 꽤 잘 맞습니다. 이를 사용하여 크기가 조정 된 이미지를 만들 수 있습니다.
GDI +로 이미지 크기를 조정하려면 다음과 같이 할 수 있습니다.
Bitmap original = ...
Bitmap scaled = new Bitmap(new Size(original.Width * 4, original.Height * 4));
using (Graphics graphics = Graphics.FromImage(scaled)) {
graphics.DrawImage(original, new Rectangle(0, 0, scaled.Width, scaled.Height));
}
답변
Imagemagick 및 GD 와 같은 테스트 된 라이브러리 는 .NET에서 사용 가능
쌍 입방 보간과 같은 것을 읽고 자신의 글을 쓸 수도 있습니다.
답변
이미지 스케일링을 위한 소스 코드를 논의하고 공유하는 CodeProject 기사 :
답변
이 라이브러리를 사용하십시오 : http://imageresizing.net
라이브러리 작성자가이 기사를 읽도록하십시오. .NET의 이미지 크기 조정 함정
답변
Graphics.InterpolationMode에 대해 다른 값을 사용해보십시오. GDI +에는 몇 가지 일반적인 스케일링 알고리즘이 있습니다. 이 중 하나가 필요한 경우 외부 라이브러리에 의존하는 대신이 경로를 사용할 수 있습니다.
답변
회사 제품 중 하나 인 dotImage 를 사용해보십시오 . 여기에는 다양한 품질 수준의 18 가지 필터 유형 이있는 이미지 를 리샘플링하기위한 개체 가 포함되어 있습니다.
일반적인 사용법은 다음과 같습니다.
// BiCubic is one technique available in PhotoShop
ResampleCommand resampler = new ResampleCommand(newSize, ResampleMethod.BiCubic);
AtalaImage newImage = resampler.Apply(oldImage).Image;
또한 dotImage에는 PhotoShop의 필터와 유사한 많은 필터를 포함하여 140 개의 이상한 이미지 처리 명령이 포함되어 있습니다.