/// <summary> /// 为图片添加文字水印 /// </summary> /// <param name="parameters">文字水印过程需要的参数体</param> /// <param name="errorMsg">异常信息</param> /// <returns>已加水印的图片数据流</returns> public static MemoryStream DrawText(TextWatermarkParameters parameters, out string errorMsg) { errorMsg = string.Empty; try { // 参数检查 if (!parameters.CheckAndSetDefault(out errorMsg)) throw new InvalidDataException(errorMsg); // 为源图片添加文字水印 Bitmap finalImage = AddWatermarkTextForSourceImage(parameters, out errorMsg); if (finalImage == null && !string.IsNullOrEmpty(errorMsg)) throw new InvalidDataException("生成水印图片失败:" + errorMsg); return GetMemoryStreamFromBitmap(finalImage, parameters.SourceImageFileExtensionName); } catch (Exception ex) { errorMsg = ex.Message.ToString(); return null; } }
/// <summary> /// 为图片添加文字水印 /// </summary> /// <param name="parameters">文字水印相关参数体</param> /// <param name="errMsg">错误信息</param> /// <returns>添加完水印的位图对象</returns> private static Bitmap AddWatermarkTextForSourceImage(TextWatermarkParameters parameters, out string errMsg) { Image srcImage = null; Graphics srcGraphics = null; errMsg = string.Empty; try { // // 获取源图片数据流 MemoryStream scMs = parameters.SourceImageStream == null ? GetImageMemoryStream(parameters.SourceImagePath, out errMsg) : parameters.SourceImageStream; if (scMs == null && !string.IsNullOrEmpty(errMsg)) throw new InvalidDataException("获取图片数据流失败!"); // // srcImage = Image.FromStream(scMs as Stream); // 新建位图并设定分辨率,需要根据图像的像素格式来判断是否需要重新绘制该图像 Bitmap srcBitmap = (IsPixelFormatIndexed(srcImage.PixelFormat)) ? RedrawBitmapByImage(srcImage) : new Bitmap(srcImage.Width, srcImage.Height, srcImage.PixelFormat); srcBitmap.SetResolution(srcImage.HorizontalResolution, srcImage.VerticalResolution); // 封装一个GDI+绘图图面,并设置图形品质 srcGraphics = Graphics.FromImage(srcBitmap); srcGraphics.SmoothingMode = SmoothingMode.AntiAlias; // 向源图片绘制到位图中 srcGraphics.DrawImage(srcImage, new Rectangle(0, 0, srcImage.Width, srcImage.Height), 0, 0, srcImage.Width, srcImage.Height, GraphicsUnit.Pixel); // // 矩形的宽度和高度,SizeF有三个属性,分别为Height高,width宽,IsEmpty是否为空 SizeF crSize = srcGraphics.MeasureString(parameters.WatermarkText, parameters.WmTextFont); // 获取水印文字的起始位置 float xPosOfWm, yPosOfWm = 0; GetWatermarkTextPosition(parameters.WmPosition, srcImage.Width, srcImage.Height, crSize.Width, crSize.Height, out xPosOfWm, out yPosOfWm); // // 文本样式 StringFormat vmTextFormat = GetStringFormat(); // 阴影画刷 SolidBrush shadowBrush = GetShadowBrush(); // 文字画刷 SolidBrush semiTransBrush = GetTextBrush(parameters.Alpha); // 第一步,绘制阴影 srcGraphics.DrawString(parameters.WatermarkText, parameters.WmTextFont, shadowBrush, new PointF(xPosOfWm + parameters.TextShadowWidth, yPosOfWm + parameters.TextShadowWidth), vmTextFormat); // 第二步,绘制文字 srcGraphics.DrawString(parameters.WatermarkText, parameters.WmTextFont, semiTransBrush, new PointF(xPosOfWm, yPosOfWm), vmTextFormat); return srcBitmap; } catch (Exception e) { errMsg = e.Message.ToString(); return null; } finally { // 释放资源 if (srcImage != null) srcImage.Dispose(); if (srcGraphics != null) srcGraphics.Dispose(); } }