Ejemplo n.º 1
0
        public void DrawCore(string imagePath, WatermarkMode mode, Action <SKData> postAction)
        {
            Logger.LogDebug($"Watermark image file: {imagePath}");
            Logger.LogDebug($"Watermark mode: {mode.AsEnumName()}");

            using (var bmp = SKBitmap.Decode(imagePath))
            {
                using (var canvas = new SKCanvas(bmp))
                {
                    var imageSize = new Size(bmp.Width, bmp.Height);

                    DrawCore(canvas, imageSize, mode);
                }

                using (var img = SKImage.FromBitmap(bmp))
                    using (var data = img.Encode(CurrentImageFormat, Options.Quality))
                    {
                        if (data.IsNull())
                        {
                            throw new InvalidOperationException(InternalResource.InvalidOperationExceptionUnsupportedImageFormat);
                        }

                        postAction.Invoke(data);
                    }
            }
        }
Ejemplo n.º 2
0
        internal void DrawCore(SKCanvas canvas, Size imageSize, WatermarkMode mode)
        {
            var coordinate = ImageHelper.CalculateCoordinate(imageSize,
                                                             Options.Watermark.Location, Options.Watermark.IsRandom);

            switch (mode)
            {
            case WatermarkMode.Text:
            {
                using (var foreFont = CreatePaint(Options.Watermark.Colors.Fore))
                    using (var alternFont = CreatePaint(Options.Watermark.Colors.Alternate))
                    {
                        var text = Options.Watermark.Text;

                        for (int i = 0; i < text.Length; i++)
                        {
                            // 当前字符
                            var character = text.Substring(i, 1);

                            // 测算水印文本内容矩形尺寸
                            var rect = new SKRect();
                            foreFont.MeasureText(character, ref rect);

                            // 绘制文本水印
                            canvas.DrawText(character, coordinate.X + (int)rect.Width, coordinate.Y,
                                            i % 2 > 0 ? alternFont : foreFont);

                            // 递增字符宽度
                            coordinate.X += (int)rect.Width;
                        }
                    }
            }
            break;

            case WatermarkMode.Image:
            {
                using (var watermark = SKBitmap.Decode(_watermarkImagePath))
                {
                    // 绘制图像水印
                    canvas.DrawBitmap(watermark, coordinate.X, coordinate.Y);
                }
            }
            break;

            default:
                break;
            }
        }
Ejemplo n.º 3
0
        public Task <byte[]> DrawBytesAsync(string imagePath, WatermarkMode mode = WatermarkMode.Text,
                                            CancellationToken cancellationToken  = default)
        {
            return(cancellationToken.RunOrCancelAsync(() =>
            {
                var buffer = default(byte[]);

                DrawCore(imagePath, mode, data =>
                {
                    buffer = data.ToArray();
                    Logger.LogDebug($"Watermark image file save as byte[]: length={buffer.Length}");
                });

                return buffer;
            }));
        }
Ejemplo n.º 4
0
        public Task <bool> DrawStreamAsync(string imagePath, Stream target,
                                           WatermarkMode mode = WatermarkMode.Text, CancellationToken cancellationToken = default)
        {
            return(cancellationToken.RunOrCancelAsync(() =>
            {
                var result = false;

                DrawCore(imagePath, mode, data =>
                {
                    data.SaveTo(target);

                    Logger.LogDebug($"Watermark image file save as stream");
                    result = true;
                });

                return result;
            }));
        }
Ejemplo n.º 5
0
        public Task <bool> DrawFileAsync(string imagePath, string savePath,
                                         WatermarkMode mode = WatermarkMode.Text, CancellationToken cancellationToken = default)
        {
            return(cancellationToken.RunOrCancelAsync(() =>
            {
                var result = false;

                DrawCore(imagePath, mode, data =>
                {
                    using (var fs = new FileStream(savePath, FileMode.OpenOrCreate))
                    {
                        data.SaveTo(fs);
                    }

                    Logger.LogDebug($"Watermark image file save as: {savePath}");
                    result = true;
                });

                return result;
            }));
        }