Beispiel #1
0
        /// <summary>
        /// 获取水印区域
        /// </summary>
        /// <param name="inputImage">待加水印的图像</param>
        /// <param name="watermarkImage">用为水印的图像</param>
        /// <returns>返回水印矩形区域</returns>
        private Rectangle GetWatermarkArea(Image inputImage, Image watermarkImage)
        {
            Rectangle imageArea     = new Rectangle(Point.Empty, inputImage.Size);
            Rectangle watermarkArea = new Rectangle(Point.Empty, watermarkImage.Size);

            RectangleUtil.PositionRectangle(this.AnchorLocation, imageArea, ref watermarkArea);

            //为边缘留出偏移量
            int offsetX = (int)((float)inputImage.Width * (float).01);
            int offsetY = (int)((float)inputImage.Height * (float).01);

            switch (AnchorLocation)
            {
            case AnchorLocation.LeftTop:
                watermarkArea.Offset(offsetX, offsetY);
                break;

            case AnchorLocation.MiddleTop:
                watermarkArea.Offset(0, offsetY);
                break;

            case AnchorLocation.RightTop:
                watermarkArea.Offset(-offsetX, offsetY);
                break;

            case AnchorLocation.LeftMiddle:
                watermarkArea.Offset(offsetX, 0);
                break;

            case AnchorLocation.Middle:
                break;

            case AnchorLocation.RightMiddle:
                watermarkArea.Offset(-offsetX, 0);
                break;

            case AnchorLocation.LeftBottom:
                watermarkArea.Offset(offsetX, -offsetY);
                break;

            case AnchorLocation.MiddleBottom:
                watermarkArea.Offset(0, -offsetY);
                break;

            case AnchorLocation.RightBottom:
                watermarkArea.Offset(-offsetX, -offsetY);
                break;
            }
            return(watermarkArea);
        }
Beispiel #2
0
        /// <summary>
        /// 按照期望的宽高比获取sourceRect中最大矩形区域
        /// </summary>
        /// <param name="sourceRect">源矩形区域</param>
        /// <param name="desiredAspect">期望的宽高比</param>
        /// <param name="anchorLocation">矩形选区停靠位置</param>
        /// <returns>返回在sourceRect内满足desiredAspect的最大矩形区域</returns>
        protected virtual Rectangle GetLargestInset(Rectangle sourceRect, float desiredAspect, AnchorLocation anchorLocation)
        {
            Rectangle destRect = default(Rectangle);

            float sourceAspect = (float)sourceRect.Width / (float)sourceRect.Height;
            float ratioScale   = desiredAspect / sourceAspect;

            if (sourceAspect > desiredAspect)
            {
                destRect.Width  = (int)((float)sourceRect.Width * ratioScale);
                destRect.Height = sourceRect.Height;
            }
            else
            {
                destRect.Width  = sourceRect.Width;
                destRect.Height = (int)((float)sourceRect.Height / ratioScale);
            }

            RectangleUtil.PositionRectangle(anchorLocation, sourceRect, ref destRect);

            return(destRect);
        }
Beispiel #3
0
        /// <summary>
        /// 获取水印区域
        /// </summary>
        /// <param name="graphics">画布</param>
        /// <param name="inputImage">图像</param>
        /// <param name="watermarkFont">水印文字使用的字体</param>
        /// <returns>返回水印矩形区域</returns>
        protected virtual Rectangle GetWatermarkArea(Graphics graphics, Image inputImage, out Font watermarkFont)
        {
            //根据图片的大小我们来确定添加上去的文字的大小
            int[] sizes = new int[] { 16, 14, 12, 10, 8, 6, 4, 3, 2, 1 };

            //字体
            watermarkFont = null;
            Size watermarkSize = Size.Empty;

            //利用一个循环语句来选择我们要添加文字的型号
            //直到它的长度比图片的宽度小
            for (int i = 0; i < sizes.Length; i++)
            {
                watermarkFont = new Font("arial", sizes[i], FontStyle.Bold);

                //测量用指定的 Font 对象绘制并用指定的 StringFormat 对象格式化的指定字符串。
                watermarkSize = graphics.MeasureString(Text, watermarkFont).ToSize();

                if (watermarkSize.Width < (inputImage.Width * 0.8))
                {
                    break;
                }
            }

            Rectangle imageArea     = new Rectangle(Point.Empty, inputImage.Size);
            Rectangle watermarkArea = new Rectangle(Point.Empty, watermarkSize);

            RectangleUtil.PositionRectangle(this.AnchorLocation, imageArea, ref watermarkArea);

            //为边缘留出偏移量
            int offsetX = (int)((float)inputImage.Width * (float).01);
            int offsetY = (int)((float)inputImage.Height * (float).01);

            switch (AnchorLocation)
            {
            case AnchorLocation.LeftTop:
                watermarkArea.Offset(offsetX, offsetY);
                break;

            case AnchorLocation.MiddleTop:
                watermarkArea.Offset(0, offsetY);
                break;

            case AnchorLocation.RightTop:
                watermarkArea.Offset(-offsetX, offsetY);
                break;

            case AnchorLocation.LeftMiddle:
                watermarkArea.Offset(offsetX, 0);
                break;

            case AnchorLocation.Middle:
                break;

            case AnchorLocation.RightMiddle:
                watermarkArea.Offset(-offsetX, 0);
                break;

            case AnchorLocation.LeftBottom:
                watermarkArea.Offset(offsetX, -offsetY);
                break;

            case AnchorLocation.MiddleBottom:
                watermarkArea.Offset(0, -offsetY);
                break;

            case AnchorLocation.RightBottom:
                watermarkArea.Offset(-offsetX, -offsetY);
                break;
            }
            return(watermarkArea);
        }