c# - 如何根据 MVC C# 中主图像或输出图像的大小增加或减少水印图像大小
问题描述
在这里,我将两个图像合并为一个图像,一个是水印图像,第二个是要合并水印的主图像或输出图像。
现在我想根据我上传的主图像增加和减少水印图像的大小
public ActionResult WaterMarkImage(HttpPostedFileBase fileToUpload)
{
using (Image image = Image.FromStream(fileToUpload.InputStream, true, false))
{
string name = Path.GetFileNameWithoutExtension(fileToUpload.FileName);
var ext = Path.GetExtension(fileToUpload.FileName);
string myfile = name + ext;
var saveImagePath = Path.Combine(Server.MapPath("~/ImgWatermark"), myfile);
Image watermarkImage = Image.FromFile(Server.MapPath("/Img/LogoImage2.png"));
Watermarker objWatermarker = new Watermarker(image);
// Set the properties for the logo
objWatermarker.Position = WatermarkPosition.Absolute;
objWatermarker.PositionX = (int)(image.Width / 2 - watermarkImage.Width / 2);
objWatermarker.PositionY = (int)(image.Height / 2 - watermarkImage.Height / 2);
objWatermarker.ScaleRatio = 1;
objWatermarker.Margin = new Padding(0);
objWatermarker.Opacity = 0.5f;
objWatermarker.TransparentColor = Color.White;
// Drawing the logo image on Main image
objWatermarker.DrawImage(watermarkImage);
objWatermarker.Image.Save(saveImagePath);
return RedirectToAction("Index", new { imgName = myfile });
}
}
解决方案
我通过将新的“WaterMarkNewHeight”和“WaterMarkNewWidth”传递给“resizeImage”类解决了这个问题。
public ActionResult WaterMarkImage(HttpPostedFileBase fileToUpload)
{
using (Image image = Image.FromStream(fileToUpload.InputStream, true, false))
{
string name = Path.GetFileNameWithoutExtension(fileToUpload.FileName);
var ext = Path.GetExtension(fileToUpload.FileName);
string myfile = name + ext;
//System.Drawing.Image bitmap = image;
var saveImagePath = Path.Combine(Server.MapPath("~/ImgWatermark"), myfile);
System.Drawing.Image watermarkImage = System.Drawing.Image.FromFile(Server.MapPath("/Img/LogoImage2.png"));
Watermarker objWatermarker = new Watermarker(image);
// Set the properties for the logo
objWatermarker.Position = WatermarkPosition.Center;
objWatermarker.PositionX = (int)(image.Width - watermarkImage.Width) / 2;
objWatermarker.PositionY = (int)(image.Height - watermarkImage.Height) / 2;
int WaterMarkNewWidth = image.Width / 2;
int WaterMarkNewHeight = image.Height / 4;
//watermarkImage.Size.Width = WaterMarkNewWidth;
objWatermarker.Margin = new Padding(0);
objWatermarker.Opacity = 0.4f;
objWatermarker.TransparentColor = Color.White;
Image watermarkImage1 = resizeImage(WaterMarkNewWidth, WaterMarkNewHeight, watermarkImage);
// Draw the logo
objWatermarker.DrawImage(watermarkImage1);
//Draw the Text
//objWatermarker.DrawText("WaterMarkDemo");
objWatermarker.Image.Save(saveImagePath);
return RedirectToAction("Index", new { imgName = myfile });
}
}
public Image resizeImage(int newWidth, int newHeight, Image stPhotoPath)
{
Image imgPhoto = stPhotoPath;
int sourceWidth = imgPhoto.Width;
int sourceHeight = imgPhoto.Height;
//Consider vertical pics
if (sourceWidth < sourceHeight)
{
int buff = newWidth;
newWidth = newHeight;
newHeight = buff;
}
int sourceX = 0, sourceY = 0, destX = 0, destY = 0;
float nPercent = 0, nPercentW = 0, nPercentH = 0;
nPercentW = ((float)newWidth / (float)sourceWidth);
nPercentH = ((float)newHeight / (float)sourceHeight);
if (nPercentH < nPercentW)
{
nPercent = nPercentH;
destX = System.Convert.ToInt16((newWidth -
(sourceWidth * nPercent)) / 2);
}
else
{
nPercent = nPercentW;
destY = System.Convert.ToInt16((newHeight -
(sourceHeight * nPercent)) / 2);
}
int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);
Bitmap bmPhoto = new Bitmap(newWidth, newHeight,
PixelFormat.Format24bppRgb);
bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
imgPhoto.VerticalResolution);
Graphics grPhoto = Graphics.FromImage(bmPhoto);
grPhoto.Clear(Color.White);
grPhoto.InterpolationMode =
System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
grPhoto.DrawImage(imgPhoto,
new Rectangle(destX, destY, destWidth, destHeight),
new Rectangle(sourceX, sourceY, sourceWidth, sourceHeight),
GraphicsUnit.Pixel);
grPhoto.Dispose();
imgPhoto.Dispose();
return bmPhoto;
}
推荐阅读
- single-sign-on - 在 SAML 中配置的 SSO 请求需要获取“电子邮件”错误
- gnuradio-companion - 如何触发 GNURadio 流程图加载并开始运行?
- r - 需要用 inext 包解决这个问题
- css - 如何禁用 Svelte 警告“未使用的 CSS 选择器”
- flutter - 在 Flutter 的父项内对角对齐项目
- typescript - TypeScript:为什么函数可以返回值,尽管它的类型不允许它?
- cron - 仅当文件大于特定大小时如何执行 cronjob?
- python - Python 中的 re.findall
- c++ - 链接 C++ 和 Fortran 时出现重复符号
- spring-restdocs - 春季restdocs中的蒙版标题