在一个相当简单的ASP.NET应用程序中,用户可以上传图像,主要来自他的数码相机。我必须将其大小调整为适合Web和缩略图的大小。 这里最好的做法是什么?是否有一个我可以在不在Web服务器上安装东西的情况下实现的库。
答案 0 :(得分:1)
SO上的这个主题可能会帮助你做出决定:
答案 1 :(得分:1)
免责声明:我是这个图书馆的作者。
然而,它专为此目的而设计,并且非常成熟且经过充分测试。
http://nathanaeljones.com/products/asp-net-image-resizer/
我认为您会发现所包含的示例应用程序完全符合您的需求。
答案 2 :(得分:0)
查看BitMap class - 您可以通过在构造函数中指定大小来轻松完成此操作。
所以想象你想要减半:
Bitmap firstBitMap; // created somewhere else
// Create a new bitmap from the first, scaling down as we go
Bitmap halfSize = new Bitmap(firstBitMap, new Size(firstBitMap.Width/2, firstBitMap.Height/2));
如果您需要更高质量的解决方案,则需要consider the InterpolationMode enumeration。
对于您描述的简单场景,您当然不需要打扰第三方库。
答案 3 :(得分:0)
我不是图像专家,但我在网站上实现了图像大小调整并使用了类似的东西:
public static void ResizeImageHighQuality(string imgFilename, string imgResizedFilename, int resizeH, int resizeW)
{
Image img = Image.FromFile(imgFilename);
int h = 0, w = 0;
if (img.Width > img.Height)
{
w = Convert.ToInt32(resizeW);
h = Convert.ToInt32(w * Convert.ToDouble(img.Height) / Convert.ToDouble(img.Width));
}
else if (img.Height > img.Width)
{
h = Convert.ToInt32(resizeH);
w = Convert.ToInt32(h * Convert.ToDouble(img.Width) / Convert.ToDouble(img.Height));
}
else
{
h = resizeH;
w = resizeW;
}
Image thumbnail = new Bitmap(w, h);
Graphics graphic = Graphics.FromImage(thumbnail);
graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphic.SmoothingMode = SmoothingMode.HighQuality;
graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphic.CompositingQuality = CompositingQuality.HighQuality;
graphic.DrawImage(img, 0, 0, w, h);
ImageCodecInfo[] Info = ImageCodecInfo.GetImageEncoders();
EncoderParameters Params = new EncoderParameters(1);
Params.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
File.Delete(imgResizedFilename);
FileStream fs = new FileStream(imgResizedFilename, FileMode.CreateNew);
thumbnail.Save(fs, Info[1], Params);
fs.Close();
}
答案 4 :(得分:0)
使用Bitmap(和任何其他System.Drawing类)是specifically prohibited in ASP.NET(请参阅文档页面顶部附近的警告)。
使用它们可能会导致以下异常:
TypeInitializationException: The type initializer for 'System.Windows.Media.Brush' threw an exception.
at System.Windows.Media.SolidColorBrush..ctor(Color color)
...
'System.Windows.Media.Transform' threw an exception.
at System.Windows.Media.Brush..cctor()Win32Exception: The operation completed successfully
at MS.Win32.UnsafeNativeMethods.RegisterClassEx(WNDCLASSEX_D wc_d)
at MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks)
at MS.Win32.MessageOnlyHwndWrapper..ctor()
at System.Windows.Threading.Dispatcher..ctor()
at System.Windows.Threading.Dispatcher.get_CurrentDispatcher()
at System.Windows.Freezable..ctor()
at System.Windows.Media.MatrixTransform..ctor(Matrix matrix)
at System.Windows.Media.Transform..cctor()
和
Win32Exception: The operation completed successfully
at MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks)
at System.Windows.Media.MediaContextNotificationWindow..ctor(MediaContext ownerMediaContext)
at System.Windows.Media.MediaContext..ctor(Dispatcher dispatcher)
根据您的目的,Windows Imaging Component可能会满足您的需求。通过创建单个STA线程并调用所有绘图操作,我们也获得了好运。