Пример #1
0
        public void Assign_Mark()
        {
            var position = new MarkPosition(1, 1);

            _board.AssignMark(_player1.Object, position);
            _board.GetMarkPosition(position).Should().Be(MarkTypeEnum.Cross);
        }
Пример #2
0
        /// <summary>
        /// 添加水印文字
        /// </summary>
        /// <param name="markString">水印文字</param>
        /// <param name="font">字段</param>
        /// <param name="markPosition">位置</param>
        /// <param name="margin">边距</param>
        public void DrawMarkString(string markString, Font font, MarkPosition markPosition, int margin = 10)
        {
            using (Graphics g = Graphics.FromImage(this.bitmap))
            {
                g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
                var sizeF = g.MeasureString(markString, font);
                // 文本区域大小
                var objectSize = new Size((int)sizeF.Width, (int)sizeF.Height);
                // 绘制水印的左上角点
                var point = this.GetObjectDrawPoint(objectSize, markPosition, margin);

                #region 计算文本的颜色
                var centerP   = new Point(point.X + objectSize.Width / 2, point.Y - objectSize.Height / 2);
                var backColor = Color.White;
                var rect      = new Rectangle(Point.Empty, this.bitmap.Size);
                if (rect.Contains(centerP))
                {
                    backColor = this.bitmap.GetPixel(centerP.X, centerP.Y);
                }
                var foreColor = Color.FromArgb(255 - backColor.R, 255 - backColor.G, 255 - backColor.B);
                #endregion

                g.DrawString(markString, font, new SolidBrush(foreColor), point);
            }
        }
Пример #3
0
        /// <summary>
        /// 获取绘制物体的八绘制左上角点坐标
        /// </summary>
        /// <param name="objectSize">物体大小</param>
        /// <param name="markPosition">水印位置</param>
        /// <param name="margin">外边距</param>
        /// <returns></returns>
        private Point GetObjectDrawPoint(Size objectSize, MarkPosition markPosition, int margin)
        {
            Point p = Point.Empty;

            switch (markPosition)
            {
            case MarkPosition.BottomLeft:
                p.X = margin;
                p.Y = this.bitmap.Height - objectSize.Height - margin;
                break;

            case MarkPosition.BottomRight:
                p.X = this.bitmap.Width - objectSize.Width - margin;
                p.Y = this.bitmap.Height - objectSize.Height - margin;
                break;

            case MarkPosition.TopLeft:
                p.X = margin;
                p.Y = margin;
                break;

            case MarkPosition.TopRiht:
                p.X = this.bitmap.Width - objectSize.Width - margin;
                p.Y = margin;
                break;

            case MarkPosition.Center:
                p.X = this.bitmap.Width / 2 - objectSize.Width / 2;
                p.Y = this.bitmap.Height / 2 - objectSize.Height / 2;
                break;
            }
            return(p);
        }
Пример #4
0
        public void Not_Assign_Mark_In_Place_With_Other_Mark()
        {
            var position = new MarkPosition(1, 1);

            _board.AssignMark(_player1.Object, position);
            _board.AssignMark(_player2.Object, position);
            _board.GetMarkPosition(position).Should().Be(MarkTypeEnum.Cross);
        }
Пример #5
0
 /// <summary>
 /// 给图片添加图片水印
 /// </summary>
 /// <param name="sourcePath">源图片的存储地址</param>
 /// <param name="watermarkPath">水印图片的物理地址</param>
 /// <param name="saveFilePath">目标图片的存储地址</param>
 /// <param name="mp">水印位置</param>
 public static void AddPicWatermarkAsJPG(string sourcePath, string watermarkPath, string saveFilePath, MarkPosition mp)
 {
     if (File.Exists(sourcePath))
     {
         using (StreamReader sr = new StreamReader(sourcePath))
         {
             AddPicWatermarkAsJPG(sr.BaseStream, watermarkPath, saveFilePath, mp);
         }
     }
 }
Пример #6
0
 public bool AssignMark(IPlayer player, MarkPosition markPosition)
 {
     if (marksList.GetMarkPosition(markPosition) == MarkTypeEnum.Empty)
     {
         marksList.SetMarkPosition(markPosition, player.MarkType);
         ++MarkCount;
         return(true);
     }
     return(false);
 }
Пример #7
0
 /// <summary>
 /// 绘制图片水印
 /// </summary>
 /// <param name="markImageFullName">水印图片文件名</param>
 /// <param name="markPosition">水印位置</param>
 /// <param name="margin">外边距</param>
 public void DrawMarkImage(string markImageFullName, MarkPosition markPosition, int margin = 10)
 {
     using (Graphics g = Graphics.FromImage(this.bitmap))
     {
         using (var image = new Bitmap(new MemoryStream(File.ReadAllBytes(markImageFullName))))
         {
             // 绘制水印的左上角点
             var point = this.GetObjectDrawPoint(image.Size, markPosition, margin);
             g.DrawImage(image, point);
         }
     }
 }
Пример #8
0
        /// <summary>
        /// 给图片添加图片水印
        /// </summary>
        /// <param name="inputStream">包含要源图片的流</param>
        /// <param name="watermarkPath">水印图片的物理地址</param>
        /// <param name="saveFilePath">目标图片的存储地址</param>
        /// <param name="mp">水印位置</param>
        public static void AddPicWatermarkAsJPG(Stream inputStream, string watermarkPath, string saveFilePath, MarkPosition mp)
        {
            Image image = Image.FromStream(inputStream);
            Bitmap b = new Bitmap(image.Width, image.Height, PixelFormat.Format24bppRgb);
            Graphics g = Graphics.FromImage(b);
            g.Clear(Color.White);
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.High;
            g.DrawImage(image, 0, 0, image.Width, image.Height);

            AddWatermarkImage(g, watermarkPath, mp, image.Width, image.Height);

            try
            {
                CompressAsJPG(b, saveFilePath, 80);
            }
            catch { ;}
            finally
            {
                b.Dispose();
                image.Dispose();
            }
        }
Пример #9
0
    public void addMarkToCell(Cell cell, MarkPosition position)
    {
        Mark mark = Instantiate(markPrefab);

        mark.transform.SetParent(cell.transform);

        switch (position)
        {
        case MarkPosition.UP:
            mark.transform.localPosition = new Vector3(halfSize, baseSize, 0);
            mark.transform.localRotation = Quaternion.Euler(0, 0, 90);
            cell.up_mark = mark;
            break;

        case MarkPosition.DOWN:
            mark.transform.localPosition = new Vector3(halfSize, 0, 0);
            mark.transform.localRotation = Quaternion.Euler(0, 0, 90);
            cell.down_mark = mark;
            break;

        case MarkPosition.LEFT:
            mark.transform.localPosition = new Vector3(0, halfSize, 0);
            cell.left_mark = mark;
            break;

        case MarkPosition.RIGHT:
            mark.transform.localPosition = new Vector3(baseSize, halfSize, 0);
            cell.right_mark = mark;
            break;
        }

        if (!allMarks.Contains(mark))
        {
            allMarks.Add(mark);
        }
    }
Пример #10
0
 /// <summary>
 /// 给图片添加文字水印
 /// </summary>
 /// <param name="sourcePath">源图片的存储地址</param>
 /// <param name="text">水印文字</param>
 /// <param name="saveFilePath">目标图片的存储地址</param>
 /// <param name="mp">水印位置</param>
 public static void AddTextWatermarkAsJPG(string sourcePath, string text, string saveFilePath, MarkPosition mp)
 {
     if (File.Exists(sourcePath))
     {
         using (StreamReader sr = new StreamReader(sourcePath))
         {
             AddTextWatermarkAsJPG(sr.BaseStream, text, saveFilePath, mp);
         }
     }
 }
Пример #11
0
        /// <summary>
        /// 给图片添加文字水印
        /// </summary>
        /// <param name="inputStream">包含要源图片的流</param>
        /// <param name="text">水印文字</param>
        /// <param name="saveFilePath">目标图片的存储地址</param>
        /// <param name="mp">水印位置</param>
        public static void AddTextWatermarkAsJPG(Stream inputStream, string text, string saveFilePath, MarkPosition mp)
        {
            Image    image = Image.FromStream(inputStream);
            Bitmap   b     = new Bitmap(image.Width, image.Height, PixelFormat.Format24bppRgb);
            Graphics g     = Graphics.FromImage(b);

            g.Clear(Color.White);
            g.SmoothingMode     = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.High;
            g.DrawImage(image, 0, 0, image.Width, image.Height);

            AddWatermarkText(g, text, mp, image.Width, image.Height);

            try
            {
                CompressAsJPG(b, saveFilePath, 80);
            }
            catch { throw new Exception("图片压缩数据有问题"); }
            finally
            {
                b.Dispose();
                image.Dispose();
            }
        }
Пример #12
0
 /// <summary>
 /// 从内存中创建水印图片
 /// </summary>
 /// <param name="inputStream">包含要源图片的流</param>
 /// <param name="watermarkPath">水印图片的物理地址</param>
 /// <param name="saveFilePath">目标图片的存储地址</param>
 /// <param name="mp">水印位置</param>
 public static Bitmap AddStreamWatermarkAsJPG(Stream inputStream, string watermarkPath, MarkPosition mp)
 {
     Image image = Image.FromStream(inputStream);
     {
         Bitmap b = new Bitmap(image.Width, image.Height, PixelFormat.Format24bppRgb);
         {
             using (Graphics g = Graphics.FromImage(b))
             {
                 //g.Clear(Color.White);
                 g.Clear(Color.Transparent);
                 g.SmoothingMode     = SmoothingMode.HighQuality;
                 g.InterpolationMode = InterpolationMode.High;
                 g.DrawImage(image, 0, 0, image.Width, image.Height);
                 AddWatermarkImage(g, watermarkPath, mp, image.Width, image.Height);
                 return(b);
             }
         }
     }
 }
Пример #13
0
        /// <summary>
        /// 添加文字水印
        /// </summary>
        /// <param name="picture">要加水印的原图像</param>
        /// <param name="text">水印文字</param>
        /// <param name="mp">添加的位置</param>
        /// <param name="width">原图像的宽度</param>
        /// <param name="height">原图像的高度</param>
        private static void AddWatermarkText(Graphics picture, string text, MarkPosition mp, int width, int height)
        {
            int[] sizes = new int[] { 16, 14, 12, 10, 8, 6, 4 };
            Font crFont = null;
            SizeF crSize = new SizeF();
            for (int i = 0; i < 7; i++)
            {
                crFont = new Font("Arial", sizes[i], FontStyle.Bold);
                crSize = picture.MeasureString(text, crFont);

                if ((ushort)crSize.Width < (ushort)width)
                    break;
            }

            float xpos = 0;
            float ypos = 0;

            switch (mp)
            {
                case MarkPosition.MP_Left_Top:
                    xpos = ((float)width * (float).01) + (crSize.Width / 2);
                    ypos = (float)height * (float).01;
                    break;
                case MarkPosition.MP_Right_Top:
                    xpos = ((float)width * (float).99) - (crSize.Width / 2);
                    ypos = (float)height * (float).01;
                    break;
                case MarkPosition.MP_Right_Bottom:
                    xpos = ((float)width * (float).99) - (crSize.Width / 2);
                    ypos = ((float)height * (float).99) - crSize.Height;
                    break;
                case MarkPosition.MP_Left_Bottom:
                    xpos = ((float)width * (float).01) + (crSize.Width / 2);
                    ypos = ((float)height * (float).99) - crSize.Height;
                    break;
            }

            StringFormat StrFormat = new StringFormat();
            StrFormat.Alignment = StringAlignment.Center;

            SolidBrush semiTransBrush2 = new SolidBrush(Color.FromArgb(150, 0, 0, 0));
            picture.DrawString(text, crFont, semiTransBrush2, xpos + 1, ypos + 1, StrFormat);

            SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(150, 127, 127, 127));
            picture.DrawString(text, crFont, semiTransBrush, xpos, ypos, StrFormat);

            semiTransBrush2.Dispose();
            semiTransBrush.Dispose();
        }
Пример #14
0
 public MarkTypeEnum GetMarkPosition(MarkPosition markPosition) =>
 marksList.GetMarkPosition(markPosition);
Пример #15
0
        internal static Diagram GetDiagram(Chord chord, ChordOptions chordOptions, DiagramStyle parentStyle)
        {
            if (null == chord)
            {
                throw new ArgumentNullException(nameof(chord));
            }

            if (null == chordOptions)
            {
                throw new ArgumentNullException(nameof(chordOptions));
            }

            if (null == parentStyle)
            {
                throw new ArgumentNullException(nameof(parentStyle));
            }

            Diagram diagram = new Diagram(parentStyle, chord.NumStrings, chord.NumFrets);

            // Setup base
            diagram.Style.Orientation            = DiagramOrientation.UpDown;
            diagram.Style.LabelLayoutModel       = DiagramLabelLayoutModel.AddPaddingVertical;
            diagram.Style.DiagramColor           = "White";
            diagram.Style.DiagramOpacity         = 0;
            diagram.Style.DiagramBorderColor     = "Black";
            diagram.Style.DiagramBorderThickness = 0;

            // Process title
            diagram.Title = chord.Title;
            diagram.Style.TitleLabelStyle       = DiagramLabelStyle.ChordName;
            diagram.Style.TitleTextSize         = chordOptions.FontSize * (19.0 / 24.0);
            diagram.Style.TitleVisible          = true;
            diagram.Style.TitleTextSizeModRatio = 0.75;
            diagram.Style.TitleGridPadding      = diagram.Style.TitleTextSize / 2.0;
            diagram.Style.TitleFontFamily       = chordOptions.FontFamily;
            diagram.Style.TitleColor            = "Black";
            diagram.Style.TitleOpacity          = 1;
            diagram.Style.TitleTextAlignment    = DiagramHorizontalAlignment.Center;

            // Process grid
            double margin = chordOptions.Margin;

            diagram.Style.GridMargin       = margin;
            diagram.Style.GridMarginLeft   = margin;
            diagram.Style.GridMarginRight  = margin;
            diagram.Style.GridMarginTop    = margin;
            diagram.Style.GridMarginBottom = margin;

            double titleHeight = diagram.Style.TitleTextSize;

            double rectWidth  = chordOptions.Width - (2.0 * chordOptions.Margin);
            double rectHeight = chordOptions.Height - titleHeight - (2.0 * chordOptions.Margin);

            diagram.Style.GridLineThickness = chordOptions.StrokeWidth;
            diagram.Style.GridStringSpacing = rectWidth / (chord.NumStrings - 1);
            diagram.Style.GridFretSpacing   = rectHeight / chord.NumFrets;

            diagram.Style.GridLineColor = "White";
            diagram.Style.GridOpacity   = 0;
            diagram.Style.GridLineColor = "Black";

            DiagramTextStyle titleTextStyle = DiagramTextStyle.Regular;

            switch (chordOptions.FontStyle)
            {
            case FontStyle.Bold:
                titleTextStyle = DiagramTextStyle.Bold;
                break;

            case FontStyle.Italic:
                titleTextStyle = DiagramTextStyle.Italic;
                break;

            case FontStyle.BoldItalic:
                titleTextStyle = DiagramTextStyle.BoldItalic;
                break;
            }
            diagram.Style.TitleTextStyle = titleTextStyle;

            // Process marks

            DiagramMarkStyleWrapper dmsw = new DiagramMarkStyleWrapper(diagram.Style);

            dmsw.MarkType            = DiagramMarkType.Normal;
            dmsw.MarkVisible         = true;
            dmsw.MarkRadiusRatio     = 0.67;
            dmsw.MarkShape           = DiagramMarkShape.Circle;
            dmsw.MarkBorderThickness = 2;
            dmsw.MarkColor           = "Black";
            dmsw.MarkOpacity         = 1.0;
            dmsw.MarkBorderColor     = "Black";

            dmsw.MarkType            = DiagramMarkType.Muted;
            dmsw.MarkVisible         = true;
            dmsw.MarkRadiusRatio     = 0.33;
            dmsw.MarkShape           = DiagramMarkShape.X;
            dmsw.MarkBorderThickness = 2;
            dmsw.MarkColor           = "Black";
            dmsw.MarkOpacity         = 1.0;
            dmsw.MarkBorderColor     = "Black";

            dmsw.MarkType = DiagramMarkType.Open;
            bool openCircle = (chordOptions.OpenStringType == OpenStringType.Circle);

            dmsw.MarkVisible         = openCircle;
            dmsw.MarkRadiusRatio     = 0.33;
            dmsw.MarkShape           = openCircle ? DiagramMarkShape.Circle : DiagramMarkShape.None;
            dmsw.MarkBorderThickness = 2;
            dmsw.MarkColor           = "White";
            dmsw.MarkOpacity         = 1.0;
            dmsw.MarkBorderColor     = "Black";

            for (int str = 0; str < chord.Marks.Length; str++)
            {
                int fret = chord.Marks[str];

                MarkPosition mp = new MarkPosition(str + 1, Math.Max(fret, 0));

                if (fret == -1)
                {
                    DiagramMark mutedMark = diagram.NewMark(mp);
                    mutedMark.Type = DiagramMarkType.Muted;
                }
                else if (fret == 0 && openCircle)
                {
                    DiagramMark openMark = diagram.NewMark(mp);
                    openMark.Type = DiagramMarkType.Open;
                }
                else if (fret > 0)
                {
                    diagram.NewMark(mp);
                }
            }

            diagram.Style.BarreVisible           = true;
            diagram.Style.BarreVerticalAlignment = DiagramVerticalAlignment.Middle;
            diagram.Style.BarreArcRatio          = 0.5;
            diagram.Style.BarreStack             = DiagramBarreStack.UnderMarks;
            diagram.Style.BarreOpacity           = 1.0;
            diagram.Style.BarreLineColor         = "Black";
            diagram.Style.BarreLineThickness     = 2.0;

            // Process barres
            if (chordOptions.BarreType == BarreType.None)
            {
                diagram.Style.BarreVisible = false;
            }

            BarrePosition bp = MarkUtils.AutoBarrePosition(chord.Marks);

            if (chord.Barre == -1)
            {
                if (chordOptions.FullBarres && null != bp)
                {
                    bp = new BarrePosition(bp.Fret, 1, chord.NumStrings);
                }
            }
            else if (chord.Barre == 0)
            {
                bp = null;
            }
            else if (chord.Barre > 0)
            {
                if (null != bp)
                {
                    if (chordOptions.FullBarres)
                    {
                        bp = new BarrePosition(bp.Fret, 1, chord.NumStrings);
                    }
                    else
                    {
                        bp = new BarrePosition(chord.Barre, bp.StartString, bp.EndString);
                    }
                }
            }

            if (chordOptions.FullBarres && null != bp)
            {
                bp = new BarrePosition(bp.Fret, 1, chord.NumStrings);
            }

            if (null != bp)
            {
                if (chordOptions.BarreType == BarreType.Straight)
                {
                    DiagramBarre straightBarre = diagram.NewBarre(bp);
                    straightBarre.Style.BarreArcRatio = 0;
                }
                else if (chordOptions.BarreType == BarreType.Arc)
                {
                    diagram.NewBarre(bp);
                }
            }

            // Process baseline / fret marker
            diagram.Style.GridNutVisible = false;
            diagram.Style.GridNutRatio   = 2.0;

            diagram.Style.FretLabelTextVisible    = true;
            diagram.Style.FretLabelTextAlignment  = DiagramHorizontalAlignment.Left;
            diagram.Style.FretLabelTextSizeRatio  = 0.6;
            diagram.Style.FretLabelTextWidthRatio = 0.5;
            diagram.Style.FretLabelTextStyle      = DiagramTextStyle.Regular;

            diagram.Style.FretLabelGridPadding = margin / 4.0;

            diagram.Style.FretLabelTextColor   = "Black";
            diagram.Style.FretLabelTextOpacity = 1.0;
            diagram.Style.FretLabelFontFamily  = chordOptions.FontFamily;

            int baseLine = chord.BaseLine;

            if (baseLine == 0)
            {
                diagram.Style.GridNutVisible = true;
            }
            else if (chord.BaseLine > 1)
            {
                FretLabelPosition flp = new FretLabelPosition(FretLabelSide.Right, 1);
                diagram.NewFretLabel(flp, baseLine.ToString());
            }

            return(diagram);
        }
Пример #16
0
        /// <summary>
        /// 添加文字水印
        /// </summary>
        /// <param name="picture">要加水印的原图像</param>
        /// <param name="text">水印文字</param>
        /// <param name="mp">添加的位置</param>
        /// <param name="width">原图像的宽度</param>
        /// <param name="height">原图像的高度</param>
        private static void AddWatermarkText(Graphics picture, string text, MarkPosition mp, int width, int height)
        {
            int[] sizes  = new int[] { 16, 14, 12, 10, 8, 6, 4 };
            Font  crFont = null;
            SizeF crSize = new SizeF();

            for (int i = 0; i < 7; i++)
            {
                crFont = new Font("Arial", sizes[i], FontStyle.Bold);
                crSize = picture.MeasureString(text, crFont);

                if ((ushort)crSize.Width < (ushort)width)
                {
                    break;
                }
            }

            float xpos = 0;
            float ypos = 0;

            switch (mp)
            {
            case MarkPosition.MP_Left_Top:
                xpos = ((float)width * (float).01) + (crSize.Width / 2);
                ypos = (float)height * (float).01;
                break;

            case MarkPosition.MP_Right_Top:
                xpos = ((float)width * (float).99) - (crSize.Width / 2);
                ypos = (float)height * (float).01;
                break;

            case MarkPosition.MP_Right_Bottom:
                xpos = ((float)width * (float).99) - (crSize.Width / 2);
                ypos = ((float)height * (float).99) - crSize.Height;
                break;

            case MarkPosition.MP_Left_Bottom:
                xpos = ((float)width * (float).01) + (crSize.Width / 2);
                ypos = ((float)height * (float).99) - crSize.Height;
                break;

            case MarkPosition.MP_Middle:
                xpos = ((float)width / 2);
                ypos = ((float)height / 2);
                break;
            }

            StringFormat StrFormat = new StringFormat();

            StrFormat.Alignment = StringAlignment.Center;

            SolidBrush semiTransBrush2 = new SolidBrush(Color.FromArgb(153, 0, 0, 0));

            picture.DrawString(text, crFont, semiTransBrush2, xpos + 1, ypos + 1, StrFormat);

            SolidBrush semiTransBrush = new SolidBrush(Color.FromArgb(153, 255, 255, 255));

            picture.DrawString(text, crFont, semiTransBrush, xpos, ypos, StrFormat);

            semiTransBrush2.Dispose();
            semiTransBrush.Dispose();
        }
Пример #17
0
        /// <summary>
        /// 添加图片水印
        /// </summary>
        /// <param name="picture">要加水印的原图像</param>
        /// <param name="waterMarkPath">水印文件的物理地址</param>
        /// <param name="mp">添加的位置</param>
        /// <param name="width">原图像的宽度</param>
        /// <param name="height">原图像的高度</param>
        private static void AddWatermarkImage(Graphics picture, string waterMarkPath, MarkPosition mp, int width, int height)
        {
            Image watermark = new Bitmap(waterMarkPath);

            ImageAttributes imageAttributes = new ImageAttributes();
            ColorMap        colorMap        = new ColorMap();

            colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
            colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
            ColorMap[] remapTable = { colorMap };

            imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);

            float[][] colorMatrixElements =
            {
                new float[] { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f },
                new float[] { 0.0f, 1.0f, 0.0f, 0.0f, 0.0f },
                new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f },
                new float[] { 0.0f, 0.0f, 0.0f, 0.3f, 0.0f },
                new float[] { 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }
            };

            ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);

            imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

            int    xpos       = 0;
            int    ypos       = 0;
            int    markWidth  = 0;
            int    markHeight = 0;
            double bl         = 1d;

            if ((width > watermark.Width * 4) && (height > watermark.Height * 4))
            {
                bl = 1;
            }
            else if ((width > watermark.Width * 4) && (height < watermark.Height * 4))
            {
                bl = Convert.ToDouble(height / 4) / Convert.ToDouble(watermark.Height);
            }
            else

            if ((width < watermark.Width * 4) && (height > watermark.Height * 4))
            {
                bl = Convert.ToDouble(width / 4) / Convert.ToDouble(watermark.Width);
            }
            else
            {
                if ((width * watermark.Height) > (height * watermark.Width))
                {
                    bl = Convert.ToDouble(height / 4) / Convert.ToDouble(watermark.Height);
                }
                else
                {
                    bl = Convert.ToDouble(width / 4) / Convert.ToDouble(watermark.Width);
                }
            }

            markWidth  = Convert.ToInt32(watermark.Width * bl);
            markHeight = Convert.ToInt32(watermark.Height * bl);


            switch (mp)
            {
            case MarkPosition.MP_Left_Top:
                int x = (width - markWidth) / 2 - 200;
                int y = (height - markHeight) / 2 - 500;
                if (x < 0)
                {
                    x = 100;
                }
                if (y < 0)
                {
                    y = 300;
                }
                xpos = x;
                ypos = y;
                break;

            case MarkPosition.MP_Right_Top:
                xpos = width - markWidth - 10;
                ypos = 10;
                break;

            case MarkPosition.MP_Right_Bottom:
                xpos = width - markWidth - 10;
                ypos = height - markHeight - 10;
                break;

            case MarkPosition.MP_Left_Bottom:
                xpos = 10;
                ypos = height - markHeight - 10;
                break;

            case MarkPosition.MP_Middle:
                xpos = (width - markWidth) / 2;
                ypos = (height - markHeight) / 2;
                break;
            }

            picture.DrawImage(watermark, new Rectangle(xpos, ypos, markWidth, markHeight), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel, imageAttributes);


            watermark.Dispose();
            imageAttributes.Dispose();
        }
Пример #18
0
        /// <summary>
        /// 添加图片水印
        /// </summary>
        /// <param name="picture">要加水印的原图像</param>
        /// <param name="waterMarkPath">水印文件的物理地址</param>
        /// <param name="mp">添加的位置</param>
        /// <param name="width">原图像的宽度</param>
        /// <param name="height">原图像的高度</param>
        private static void AddWatermarkImage(Graphics picture, string waterMarkPath, MarkPosition mp, int width, int height)
        {
            Image watermark = new Bitmap(waterMarkPath);

            ImageAttributes imageAttributes = new ImageAttributes();
            ColorMap colorMap = new ColorMap();

            colorMap.OldColor = Color.FromArgb(150, 0, 127, 0);
            colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
            ColorMap[] remapTable = { colorMap };

            imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);

            float[][] colorMatrixElements = {
                                                 new float[] {1.0f,  0.0f,  0.0f,  0.0f, 0.0f},
                                                 new float[] {0.0f,  1.0f,  0.0f,  0.0f, 0.0f},
                                                 new float[] {0.0f,  0.0f,  1.0f,  0.0f, 0.0f},
                                                 new float[] {0.0f,  0.0f,  0.0f,  0.3f, 0.0f},
                                                 new float[] {0.0f,  0.0f,  0.0f,  0.0f, 1.0f}
                                             };

            ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);

            imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

            int xpos = 0;
            int ypos = 0;
            int WatermarkWidth = 0;
            int WatermarkHeight = 0;
            double bl = 1d;
            if ((width > watermark.Width * 4) && (height > watermark.Height * 4))
            {
                bl = 1;
            }
            else if ((width > watermark.Width * 4) && (height < watermark.Height * 4))
            {
                bl = Convert.ToDouble(height / 4) / Convert.ToDouble(watermark.Height);

            }
            else

                if ((width < watermark.Width * 4) && (height > watermark.Height * 4))
                {
                    bl = Convert.ToDouble(width / 4) / Convert.ToDouble(watermark.Width);
                }
                else
                {
                    if ((width * watermark.Height) > (height * watermark.Width))
                    {
                        bl = Convert.ToDouble(height / 4) / Convert.ToDouble(watermark.Height);

                    }
                    else
                    {
                        bl = Convert.ToDouble(width / 4) / Convert.ToDouble(watermark.Width);

                    }

                }

            WatermarkWidth = Convert.ToInt32(watermark.Width * bl);
            WatermarkHeight = Convert.ToInt32(watermark.Height * bl);

            switch (mp)
            {
                case MarkPosition.MP_Left_Top:
                    xpos = 10;
                    ypos = 10;
                    break;
                case MarkPosition.MP_Right_Top:
                    xpos = width - WatermarkWidth - 10;
                    ypos = 10;
                    break;
                case MarkPosition.MP_Right_Bottom:
                    xpos = width - WatermarkWidth - 10;
                    ypos = height - WatermarkHeight - 10;
                    break;
                case MarkPosition.MP_Left_Bottom:
                    xpos = 10;
                    ypos = height - WatermarkHeight - 10;
                    break;
            }

            picture.DrawImage(watermark, new Rectangle(xpos, ypos, WatermarkWidth, WatermarkHeight), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel, imageAttributes);

            watermark.Dispose();
            imageAttributes.Dispose();
        }