C#.NET:调整容器div元素内图像的大小
我有以下标记代码,其中包含container div元素和嵌套在div中的img标记。container div具有width、height、top和left CSS样式属性 最初上传的图像具有任意宽度和高度,可能大于或小于容器分区。因此,必须调整最初上传的图像的大小并进行良好缩放,并将其保存为缩略图,以位于容器分区的边界内。调整大小的缩略图将显示为源(src)在以下标记中:C#.NET:调整容器div元素内图像的大小,c#,.net,C#,.net,我有以下标记代码,其中包含container div元素和嵌套在div中的img标记。container div具有width、height、top和left CSS样式属性 最初上传的图像具有任意宽度和高度,可能大于或小于容器分区。因此,必须调整最初上传的图像的大小并进行良好缩放,并将其保存为缩略图,以位于容器分区的边界内。调整大小的缩略图将显示为源(src)在以下标记中: <div id="divContainer" style="width: 600px; height: 450px
<div id="divContainer" style="width: 600px; height: 450px; top: 50px; left: 20px;">
<img src="[my resized and well scaled thumbnail source]..." id="imgResizedThumnail" />
</div>
这就是我使用的:
public static Image Resize(
Image srcImage,
int newWidth,
int maxHeight,
int dpi = 72)
{
if(srcImage.Width<=newWidth)
{
newWidth = srcImage.Width;
}
var newHeight = srcImage.Height * newWidth / srcImage.Width;
if (newHeight > maxHeight)
{
newWidth = srcImage.Width * maxHeight / srcImage.Height;
newHeight = maxHeight;
}
var newImage = new Bitmap(newWidth, newHeight);
newImage.SetResolution(dpi, dpi);
using (var gr = Graphics.FromImage(newImage))
{
gr.SmoothingMode = SmoothingMode.AntiAlias;
gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
gr.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
}
return newImage;
}
公共静态图像大小调整(
图像,图像,
int newWidth,
int最大高度,
int dpi=72)
{
if(srcImage.Width maxHeight)
{
newWidth=srcImage.Width*maxHeight/srcImage.Height;
newHeight=maxHeight;
}
var newImage=新位图(新宽度、新高度);
设置分辨率(dpi,dpi);
使用(var gr=Graphics.FromImage(newImage))
{
gr.SmoothingMode=SmoothingMode.AntiAlias;
gr.InterpolationMode=InterpolationMode.HighQualityBicubic;
gr.PixelOffsetMode=PixelOffsetMode.HighQuality;
gr.DrawImage(srcImage,新矩形(0,0,newWidth,newHeight));
}
返回新图像;
}
我会这样做:
public void SaveThumbnailImageWithbestScaling(Image originalImage, int containerDivWidth, int containerDivHeight)
{
string thumbnailFilename = "myThumnailFileName";
int thumbnailWidth = 0;
int thumbnailHeight = 0;
float imgWidth = (float)originalImage.Width;
float imgHeight = (float)originalImage.Height;
float scale_w = imgWidth / (float)containerDivWidth;
float scale_h = imgHeight / (float)containerDivHeight;
// Compute how much each scale diverge from 1 (1 means no scaling, which is desirable)
float variance_w = Math.Abs(1.0 - scale_w);
float variance_h = Math.Abs(1.0 - scale_h);
if (variance_w > variance_h)
{
// Height ratio is closer to 1
float aspect_ratio = imgWidth / imgHeight;
thumbnailHeight = containerDivHeight;
thumbnailWidth = (int)Math.Floor(aspect_ratio * imgWidth);
}
else
{
// Width ratio is closer to 1
float aspect_ratio = imgHeight / imgWidth;
thumbnailHeight = (int)Math.Floor(aspect_ratio * imgHeight);
thumbnailWidth = containerDivWidth;
}
Bitmap thumnailImage = CreateThumbnail(thumbnailFilename,int thumnailWidth, int thumnailHeight);
// 3. save thumbnail
SaveThumnail(thumnailImage);
}
该算法计算每个维度的比率,然后找出哪个维度与div标记的维度差异最大。然后,它继续捕捉与div标记大小差异最小的维度,并缩放另一个维度以考虑图像的纵横比
当然还有其他方法,例如,您可以不关心纵横比,只将两个维度捕捉到div标记的维度
public void SaveThumbnailImageWithbestScaling(Image originalImage, int containerDivWidth, int containerDivHeight)
{
string thumbnailFilename = "myThumnailFileName";
int thumbnailWidth = 0;
int thumbnailHeight = 0;
float imgWidth = (float)originalImage.Width;
float imgHeight = (float)originalImage.Height;
float scale_w = imgWidth / (float)containerDivWidth;
float scale_h = imgHeight / (float)containerDivHeight;
// Compute how much each scale diverge from 1 (1 means no scaling, which is desirable)
float variance_w = Math.Abs(1.0 - scale_w);
float variance_h = Math.Abs(1.0 - scale_h);
if (variance_w > variance_h)
{
// Height ratio is closer to 1
float aspect_ratio = imgWidth / imgHeight;
thumbnailHeight = containerDivHeight;
thumbnailWidth = (int)Math.Floor(aspect_ratio * imgWidth);
}
else
{
// Width ratio is closer to 1
float aspect_ratio = imgHeight / imgWidth;
thumbnailHeight = (int)Math.Floor(aspect_ratio * imgHeight);
thumbnailWidth = containerDivWidth;
}
Bitmap thumnailImage = CreateThumbnail(thumbnailFilename,int thumnailWidth, int thumnailHeight);
// 3. save thumbnail
SaveThumnail(thumnailImage);
}