private static void WriteStringToReangle(Graphics gfx, SlantWatermark watermark, Rectangle rectangle) { string text = GetRepeatString(gfx, watermark.Text, watermark.Spacing, watermark.Font, rectangle.Width); string alternateText = text.Substring(text.Length - watermark.Text.Length / 2) + watermark.Spacing + text; int centerY = rectangle.Height / 2 + rectangle.Y; gfx.DrawString(text, watermark.Font, watermark.Brush, rectangle.X, centerY); bool alternate = true; for (int pos = centerY - watermark.Indent; pos > rectangle.Y; pos -= watermark.Indent, alternate = !alternate) { gfx.DrawString(alternate ? alternateText : text, watermark.Font, watermark.Brush, rectangle.X, pos); gfx.DrawString(alternate ? alternateText : text, watermark.Font, watermark.Brush, rectangle.X, centerY * 2 - pos); } }
public static Image Mark(Image originalImage, Image waterMark, SlantWatermark slantWatermark = null, TextUnderLogo textUnderLogo = null) { const int minWidthRate = 2; const int minHeightRate = 3; if (originalImage.Width / waterMark.Width < minWidthRate || originalImage.Height / waterMark.Height < minHeightRate) { return(new Bitmap(originalImage)); } Image newImage = new Bitmap(originalImage); using (Graphics gfx = Graphics.FromImage(newImage)) { gfx.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; gfx.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; if (slantWatermark != null) { AddSlantWatermark(gfx, newImage.Width, newImage.Height, slantWatermark); } int marginBottom = 20; int marginLeft = 20; int logoMarginBottom = marginBottom; if (textUnderLogo != null) { SizeF fontSize = gfx.MeasureString(textUnderLogo.Text, textUnderLogo.Font); logoMarginBottom += (int)fontSize.Height; gfx.DrawString(textUnderLogo.Text, textUnderLogo.Font, textUnderLogo.Brush, originalImage.Width - fontSize.Width - marginLeft, originalImage.Height - fontSize.Height - marginBottom); } gfx.DrawImage(waterMark, new Rectangle(originalImage.Width - waterMark.Width - marginLeft, originalImage.Height - waterMark.Height - logoMarginBottom, waterMark.Width, waterMark.Height), 0, 0, waterMark.Width, waterMark.Height, GraphicsUnit.Pixel); } return(newImage); }
private static void AddSlantWatermark(Graphics gfx, int width, int height, SlantWatermark watermark) { int watermarkWidth = Convert.ToInt32(height / 2.0 + Math.Sqrt(3) * width / 2); int watermarkHeight = Convert.ToInt32(width / 2.0 + Math.Sqrt(3) * height / 2); int centerX = Convert.ToInt32(width / 2); int centerY = Convert.ToInt32(height / 2); Rectangle rectangle = new Rectangle(centerX - watermarkWidth / 2, centerY - watermarkHeight / 2, watermarkWidth, watermarkHeight); gfx.TranslateTransform(centerX, centerY); gfx.RotateTransform(-30); gfx.TranslateTransform(-centerX, -centerY); WriteStringToReangle(gfx, watermark, rectangle); gfx.ResetTransform(); }
public static void Mark(string originImagePath, string watermarkImagePath, string outputFolder, SlantWatermark slantWatermark = null, TextUnderLogo textUnderLogo = null) { string fileName = Path.GetFileName(originImagePath); Mark(originImagePath, watermarkImagePath, outputFolder, fileName, slantWatermark, textUnderLogo); }
public static void Mark(string originImagePath, string watermarkImagePath, string outputFolder, string fileName, SlantWatermark slantWatermark = null, TextUnderLogo textUnderLogo = null) { if (!Directory.Exists(outputFolder)) { Directory.CreateDirectory(outputFolder); } string newImagePath = Path.Combine(outputFolder, fileName); Image newImage; using (Image originImage = Image.FromFile(originImagePath) , watermarkImage = Image.FromFile(watermarkImagePath)) { newImage = Mark(originImage, watermarkImage, slantWatermark, textUnderLogo); } //放在这里确保newImagePath与originImagePath相同时能正常保存 newImage.Save(newImagePath, ImageFormat.Jpeg); newImage.Dispose(); }