C# 3.0 .NET各向同性图像绘制
有人知道如何各向同性地调整图像大小吗?这意味着我给了它一个设定的宽度/高度,并且图像被缩放以适应该框中相同的比例,即使它周围有空白?是的。首先计算尺寸,使宽度适合盒子。然后检查计算的高度是否大于框,在这种情况下,您可以计算尺寸,使高度适合框。找到它:C# 3.0 .NET各向同性图像绘制,c#-3.0,C# 3.0,有人知道如何各向同性地调整图像大小吗?这意味着我给了它一个设定的宽度/高度,并且图像被缩放以适应该框中相同的比例,即使它周围有空白?是的。首先计算尺寸,使宽度适合盒子。然后检查计算的高度是否大于框,在这种情况下,您可以计算尺寸,使高度适合框。找到它: public Image ResizeIsotropic(Image src, Size sz) { double d1 = sz.Width / (double)sz.Height; double
public Image ResizeIsotropic(Image src, Size sz)
{
double d1 = sz.Width / (double)sz.Height;
double d2 = src.Width / (double)src.Height;
if (d1 > d2)
{
src = ResizeByHeight(src, sz.Height);
}
else
{
src = ResizeByWidth(src, sz.Width);
}
Image rtn = null;
using (Image thumbnail = new Bitmap(sz.Width, sz.Height, PixelFormat.Format32bppArgb))
{
using (Graphics graphic = System.Drawing.Graphics.FromImage(thumbnail))
{
graphic.FillRectangle(Brushes.White, 0, 0, sz.Width, sz.Height);
graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphic.SmoothingMode = SmoothingMode.HighQuality;
graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphic.CompositingQuality = CompositingQuality.HighQuality;
graphic.DrawImage(src, (sz.Width - src.Width)/2, (sz.Height - src.Height)/2, src.Width, src.Height);
EncoderParameters encoderParameters;
encoderParameters = new EncoderParameters(1);
ImageCodecInfo jpginfo = GetImageCodecInfo(ImageFormat.Jpeg);
encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, Quality);
MemoryStream ms = new MemoryStream();
thumbnail.Save(ms, jpginfo, encoderParameters);
rtn = Image.FromStream(ms);
}
}
theImage = rtn;
return rtn;
}
private ImageCodecInfo GetImageCodecInfo(ImageFormat format)
{
ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpginfo = null;
foreach (ImageCodecInfo i in info)
{
if (i.FormatID == format.Guid)
{
jpginfo = i;
break;
}
}
return jpginfo;
}
ResizeByWidth和ResizeByHeight函数是我所拥有的库的其他部分,它们的功能与您所认为的完全相同
结果如下:
虽然我相信约翰·博克的答案是足够的,但这可能是一种更简洁的方法:
static Bitmap ResizeIsotropic(Image img, Size newSize, Color backgroundColor)
{
int Width, Height;
if (img.Width >= img.Height)
{
Width = newSize.Width;
Height = (int)(img.Height / (img.Width / Width));
}
else
{
Height = newSize.Height;
Width = (int)(img.Width / (img.Height / Height));
}
Bitmap bmp = new Bitmap(newSize.Width, newSize.Height);
using (Graphics gfx = Graphics.FromImage(bmp))
{
gfx.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
gfx.Clear(backgroundColor);
gfx.DrawImage(img, (bmp.Width / 2) - (Width / 2), (bmp.Height / 2) - (Height / 2), Width, Height);
}
return bmp;
}
然后,简单地称之为:
Bitmap bmp = ResizeIsotropic(Image.FromFile(@"c:\yourImage.jpg"), new Size(512, 512), Color.Black);
bmp.Save(@"c:\test.bmp");
是的,我知道怎么做:)。。。找到代码…知道我从哪里得到ImageCodecInfo吗?是的,我也写了,我会发布的。第一幅是原图,第二幅是原图,大小调整为300x300Htrnm。。。所以我只想为其中的两个做一些调整大小的方法?你说它们完全按照它们听起来的样子做-我不知道你的意思是什么…ResizeByHeight调整图像的大小,并将高度设置为传入的值,ResizeByWidth做相同的调整,但宽度不同。基本上,它首先调整大小以适应该区域,然后将其绘制到偏移了额外距离一半的区域。