计算图像尺寸
问题描述:
基本上,我有一个图像可能很大(在高度和宽度上都有几千像素),并且在宽度和高度上可能会有相当大的变化。计算图像尺寸
我需要做的是在大约500像素的高度和宽度上显示这些图像 - 但我想保持这些图像的纵横比完好无损,所以这些值会非常接近。但是我对我可以在原始宽度和高度上使用哪些计算来让他们获得正确的数字感到困惑。
任何想法?
答
试试这个:
Size original = new Size(5000,4000);
double ratio = (double)original.Height/original.Width;
int resizePercent = 50;
int newWidth = Convert.ToInt32(original.Width*resizePercent/100);
int newHeight = Convert.ToInt32(newWidth * ratio);
Size resized = new Size(newWidth,newHeight);
当然只是原变量设置为你的图片大小,并确定你的大小调整比例。你可以计算调整大小的百分比,如果你有这样的目标宽度:
int targetWidth = 500;
int resizePercent = Convert.ToInt32((double)original.Width/targetWidth);
答
几个星期前我遇到了这个问题。看看这篇文章http://www.4guysfromrolla.com/articles/012203-1.2.aspx
创建一个通用处理器(ashx的),用于查找图像,调整其大小,并将其返回
这里是我最终使用(你可以在飞行中调整):
public void ProcessRequest (HttpContext context) {
TimeSpan refresh = new TimeSpan(168, 0, 0);
HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.Add(refresh));
HttpContext.Current.Response.Cache.SetMaxAge(refresh);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public);
HttpContext.Current.Response.Cache.SetValidUntilExpires(true);
string dir = HttpContext.Current.Request.QueryString["dir"];
string img = HttpContext.Current.Request.QueryString["img"];
bool force = HttpContext.Current.Request.QueryString["force"] == "yes";
double w = 0;
double h = 0;
string path = null;
Image orig = null;
Image thumb = null;
//make sure we have a directory and image filename
if (string.IsNullOrEmpty(dir))
return;
//make sure that we allow access to that directory, could do some extra sneaky security stuff here if we had to... (only accept a DirectoryID so the user doesn't know the actual path)
switch (dir)
{
case "user":
dir = "assets/images/users";
if (string.IsNullOrEmpty(img) || img == "undefined") img = "0.jpg";
break;
break;
case "icon":
dir = "assets/images/icons";
break;
default:
dir = "assets/images";
break;
}
//make sure that the image filename is just a filename
if (img.IndexOf("/") > -1 | img.IndexOf("\\") > -1)
return;
//make sure the image exists
path = HttpContext.Current.Server.MapPath("~/" + dir + "/" + img);
if (System.IO.File.Exists(path))
{
orig = Image.FromFile(path);
}
else
{
return;
}
//if there is a max width or height
if (double.TryParse(HttpContext.Current.Request.QueryString["w"], out w) | double.TryParse(HttpContext.Current.Request.QueryString["h"], out h))
{
//thumb is the resized image
double s = 1;
if (w > 0 & h > 0)
{
double ratio = h/w;
if (orig.Height/(double)orig.Width > ratio)
{
if (orig.Height > h)
{
if (force)
s = w/(double)orig.Width;
else
s = h/(double)orig.Height;
}
}
else
{
if (orig.Width > w)
{
if (force)
s = h/(double)orig.Height;
else
s = w/(double)orig.Width;
}
}
}
else if (w > 0)
{
if (orig.Width > w)
{
s = w/(double)orig.Width;
}
}
else if (h > 0)
{
if (orig.Height > h)
{
s = h/(double)orig.Height;
}
}
//double flip gets it to lose the embedded thumbnail
//http://www.4guysfromrolla.com/articles/012203-1.2.aspx
orig.RotateFlip(RotateFlipType.Rotate180FlipNone);
orig.RotateFlip(RotateFlipType.Rotate180FlipNone);
thumb = orig.GetThumbnailImage(Convert.ToInt32(orig.Width * s), Convert.ToInt32(orig.Height * s), null, IntPtr.Zero);
if (force && w > 0 & h > 0)
thumb = cropImage(thumb, (int)w, (int)h);
}
else
{
//thumb is the image at it's original size
thumb = orig;
}
HttpContext.Current.Response.ContentType = "image/jpeg";
thumb.Save(HttpContext.Current.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
}
private Image cropImage(Image img, int w, int h)
{
if (w > img.Width && h > img.Height)
return img;
Rectangle cropArea = new Rectangle((img.Width - w)/2, (img.Height - h)/2, w, h);
Bitmap bmpImage = new Bitmap(img);
Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);
return (Image)(bmpCrop);
}
public bool IsReusable {
get {
return false;
}
}
+0
你怎么知道他想要在网页上显示? :) –
有你看这里http://stackoverflow.com/questions/1940581/c-sharp-image-resizing-to-different-size-while-preserving-aspect-ratio –
在什么平台上显示出来? Silverlight的? WPF?的WinForms? asp.net? (等)你的答案可以依赖于这些信息。 –