/// <summary> /// 获取水印区域 /// </summary> /// <param name="inputImage">待加水印的图像</param> /// <param name="watermarkImage">用为水印的图像</param> /// <returns>返回水印矩形区域</returns> private Rectangle GetWatermarkArea(Image inputImage, Image watermarkImage) { Rectangle imageArea = new Rectangle(Point.Empty, inputImage.Size); Rectangle watermarkArea = new Rectangle(Point.Empty, watermarkImage.Size); RectangleUtil.PositionRectangle(this.AnchorLocation, imageArea, ref watermarkArea); //为边缘留出偏移量 int offsetX = (int)((float)inputImage.Width * (float).01); int offsetY = (int)((float)inputImage.Height * (float).01); switch (AnchorLocation) { case AnchorLocation.LeftTop: watermarkArea.Offset(offsetX, offsetY); break; case AnchorLocation.MiddleTop: watermarkArea.Offset(0, offsetY); break; case AnchorLocation.RightTop: watermarkArea.Offset(-offsetX, offsetY); break; case AnchorLocation.LeftMiddle: watermarkArea.Offset(offsetX, 0); break; case AnchorLocation.Middle: break; case AnchorLocation.RightMiddle: watermarkArea.Offset(-offsetX, 0); break; case AnchorLocation.LeftBottom: watermarkArea.Offset(offsetX, -offsetY); break; case AnchorLocation.MiddleBottom: watermarkArea.Offset(0, -offsetY); break; case AnchorLocation.RightBottom: watermarkArea.Offset(-offsetX, -offsetY); break; } return(watermarkArea); }
/// <summary> /// 按照期望的宽高比获取sourceRect中最大矩形区域 /// </summary> /// <param name="sourceRect">源矩形区域</param> /// <param name="desiredAspect">期望的宽高比</param> /// <param name="anchorLocation">矩形选区停靠位置</param> /// <returns>返回在sourceRect内满足desiredAspect的最大矩形区域</returns> protected virtual Rectangle GetLargestInset(Rectangle sourceRect, float desiredAspect, AnchorLocation anchorLocation) { Rectangle destRect = default(Rectangle); float sourceAspect = (float)sourceRect.Width / (float)sourceRect.Height; float ratioScale = desiredAspect / sourceAspect; if (sourceAspect > desiredAspect) { destRect.Width = (int)((float)sourceRect.Width * ratioScale); destRect.Height = sourceRect.Height; } else { destRect.Width = sourceRect.Width; destRect.Height = (int)((float)sourceRect.Height / ratioScale); } RectangleUtil.PositionRectangle(anchorLocation, sourceRect, ref destRect); return(destRect); }
/// <summary> /// 获取水印区域 /// </summary> /// <param name="graphics">画布</param> /// <param name="inputImage">图像</param> /// <param name="watermarkFont">水印文字使用的字体</param> /// <returns>返回水印矩形区域</returns> protected virtual Rectangle GetWatermarkArea(Graphics graphics, Image inputImage, out Font watermarkFont) { //根据图片的大小我们来确定添加上去的文字的大小 int[] sizes = new int[] { 16, 14, 12, 10, 8, 6, 4, 3, 2, 1 }; //字体 watermarkFont = null; Size watermarkSize = Size.Empty; //利用一个循环语句来选择我们要添加文字的型号 //直到它的长度比图片的宽度小 for (int i = 0; i < sizes.Length; i++) { watermarkFont = new Font("arial", sizes[i], FontStyle.Bold); //测量用指定的 Font 对象绘制并用指定的 StringFormat 对象格式化的指定字符串。 watermarkSize = graphics.MeasureString(Text, watermarkFont).ToSize(); if (watermarkSize.Width < (inputImage.Width * 0.8)) { break; } } Rectangle imageArea = new Rectangle(Point.Empty, inputImage.Size); Rectangle watermarkArea = new Rectangle(Point.Empty, watermarkSize); RectangleUtil.PositionRectangle(this.AnchorLocation, imageArea, ref watermarkArea); //为边缘留出偏移量 int offsetX = (int)((float)inputImage.Width * (float).01); int offsetY = (int)((float)inputImage.Height * (float).01); switch (AnchorLocation) { case AnchorLocation.LeftTop: watermarkArea.Offset(offsetX, offsetY); break; case AnchorLocation.MiddleTop: watermarkArea.Offset(0, offsetY); break; case AnchorLocation.RightTop: watermarkArea.Offset(-offsetX, offsetY); break; case AnchorLocation.LeftMiddle: watermarkArea.Offset(offsetX, 0); break; case AnchorLocation.Middle: break; case AnchorLocation.RightMiddle: watermarkArea.Offset(-offsetX, 0); break; case AnchorLocation.LeftBottom: watermarkArea.Offset(offsetX, -offsetY); break; case AnchorLocation.MiddleBottom: watermarkArea.Offset(0, -offsetY); break; case AnchorLocation.RightBottom: watermarkArea.Offset(-offsetX, -offsetY); break; } return(watermarkArea); }