C# 切割图像的中心
假设我有一个400x300px的图像,我想把它剪切成200x200px,在服务器端(C#,.NET4.0)居中C# 切割图像的中心,c#,image,image-processing,C#,Image,Image Processing,假设我有一个400x300px的图像,我想把它剪切成200x200px,在服务器端(C#,.NET4.0)居中 我怎么做?使用一种画布并移动它?有任何教程/代码示例/建议吗?使用目标大小创建新位图对象 围绕位图创建图形对象 在该Graphcs对象上,使用适当的参数调用DrawImage(),这将从第一张图片中剪切出适当的片段 代码将类似于: Bitmap dstBitmap=new Bitmap(200, 200); using (Graphics g=Graphics.FromImage(ds
我怎么做?使用一种画布并移动它?有任何教程/代码示例/建议吗?使用目标大小创建新位图对象 围绕位图创建图形对象 在该Graphcs对象上,使用适当的参数调用DrawImage(),这将从第一张图片中剪切出适当的片段 代码将类似于:
Bitmap dstBitmap=new Bitmap(200, 200);
using (Graphics g=Graphics.FromImage(dstBitmap))
{
srcBitmap.DrawImage(dstBitmap, /* cropping parameters here */);
}
// at the end you'll have your bitmap in dstBitmap, ...
我没有为这些方法包含文字参数,请使用intellisense和manual来计算它们。尝试以下方法:
Bitmap sourceImage = ...;
int targetWidth = 200;
int targetHeight = 200;
int x = sourceImage.Width / 2 - targetWidth / 2;
int y = sourceImage.Height / 2 - targetHeight / 2;
Rectangle cropArea =
new Rectangle(x, y, targetWidth, targetHeight);
Bitmap targetImage =
sourceImage.Clone(cropArea, sourceImage.PixelFormat);
如果源图像小于目标图像大小,这显然会失败,但您知道了。如果需要,此方法将保存在中心裁剪的图像:
bool SaveCroppedImage(Image image, int targetWidth, int targetHeight, string filePath)
{
ImageCodecInfo jpgInfo = ImageCodecInfo.GetImageEncoders().Where(codecInfo => codecInfo.MimeType == "image/jpeg").First();
Image finalImage = image;
System.Drawing.Bitmap bitmap = null;
try
{
int left = 0;
int top = 0;
int srcWidth = targetWidth;
int srcHeight = targetHeight;
bitmap = new System.Drawing.Bitmap(targetWidth, targetHeight);
double croppedHeightToWidth = (double)targetHeight / targetWidth;
double croppedWidthToHeight = (double)targetWidth / targetHeight;
if (image.Width > image.Height)
{
srcWidth = (int)(Math.Round(image.Height * croppedWidthToHeight));
if (srcWidth < image.Width)
{
srcHeight = image.Height;
left = (image.Width - srcWidth) / 2;
}
else
{
srcHeight = (int)Math.Round(image.Height * ((double)image.Width / srcWidth));
srcWidth = image.Width;
top = (image.Height - srcHeight) / 2;
}
}
else
{
srcHeight = (int)(Math.Round(image.Width * croppedHeightToWidth));
if (srcHeight < image.Height)
{
srcWidth = image.Width;
top = (image.Height - srcHeight) / 2;
}
else
{
srcWidth = (int)Math.Round(image.Width * ((double)image.Height / srcHeight));
srcHeight = image.Height;
left = (image.Width - srcWidth) / 2;
}
}
using (Graphics g = Graphics.FromImage(bitmap))
{
g.SmoothingMode = SmoothingMode.HighQuality;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.CompositingQuality = CompositingQuality.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(image, new Rectangle(0, 0, bitmap.Width, bitmap.Height), new Rectangle(left, top, srcWidth, srcHeight), GraphicsUnit.Pixel);
}
finalImage = bitmap;
}
catch { }
try
{
using (EncoderParameters encParams = new EncoderParameters(1))
{
encParams.Param[0] = new EncoderParameter(Encoder.Quality, (long)100);
//quality should be in the range [0..100] .. 100 for max, 0 for min (0 best compression)
finalImage.Save(filePath, jpgInfo, encParams);
return true;
}
}
catch { }
if (bitmap != null)
{
bitmap.Dispose();
}
return false;
}
bool savecropedimage(图像图像、int-targetWidth、int-targetLight、字符串文件路径)
{
ImageCodecInfo jpgInfo=ImageCodecInfo.GetImageEncoders()。其中(codecInfo=>codecInfo.MimeType==“image/jpeg”).First();
图像最终图像=图像;
System.Drawing.Bitmap位图=空;
尝试
{
int左=0;
int-top=0;
int srcWidth=targetWidth;
int srchheight=targetHeight;
位图=新系统.Drawing.bitmap(targetWidth,targetSight);
双裁剪高度宽度=(双)目标宽度/目标宽度;
双裁剪宽度到高度=(双)目标宽度/目标高度;
如果(image.Width>image.Height)
{
srcWidth=(int)(Math.Round(image.Height*裁剪宽度到高度));
if(srcWidth
您所说的“此处裁剪参数”是什么意思?请尝试自己找出参数。DrawImage()方法有几个重载,您必须找到一个适合您的重载。您必须定义一个矩形,该矩形具有要剪切的图像部分的坐标。我认为这与此问题类似: