示例#1
0
        /// <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;
            }
        }
示例#2
0
        /// <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();
            }
        }