public static Image Resize(Image source, ResizeTypes resizeType, int width, int height) { ResizeModel model = new ResizeModel(); model.Source = source; model.ResizeType = resizeType; model.Width = width; model.Height = height; return(Resize(model)); }
public static Image Resize(ResizeModel model) { int srcWidth, srcHeight, destWidth, destHeight, cutWidth, cutHeight, x, y; #region 初始化变量 x = model.StartX; y = model.StartY; cutWidth = srcWidth = model.Source.Width; cutHeight = srcHeight = model.Source.Height; destWidth = model.Width; destHeight = model.Height; #endregion #region 确定画布大小及裁剪尺寸 switch (model.ResizeType) { case ResizeTypes.Auto: GetFinalSize(model.Width, model.Height, srcWidth, srcHeight, out destWidth, out destHeight); break; case ResizeTypes.Cut: #region 裁剪算法 double srcProportion = (double)srcWidth / srcHeight; double destProportion = (double)model.Width / model.Height; bool autoCut = x == -1 && y == -1; if (srcProportion >= destProportion) { //高瘦,固定高度,求宽度 cutWidth = (int)Math.Floor(srcHeight * destProportion); if (autoCut) { x += (srcWidth - cutWidth) / 2; } } else { //矮胖,固定宽度,球高度 cutHeight = (int)Math.Floor(srcWidth / destProportion); if (autoCut) { y += (srcHeight - cutHeight) / 2; } } if (x + cutWidth > srcWidth) { cutWidth = srcWidth - x; } if (y + cutHeight > srcHeight) { cutHeight = srcHeight - y; } #endregion break; case ResizeTypes.FixedHeight: GetFinalSize(model.Width, model.Height, srcHeight - 1, srcHeight, out destWidth, out destHeight); break; case ResizeTypes.FixedWidth: GetFinalSize(model.Width, model.Height, srcWidth, srcWidth - 1, out destWidth, out destHeight); break; default: break; } #endregion Image imgResult = new Bitmap(destWidth, destHeight);//结果对象 using (var g = Graphics.FromImage(imgResult)) { //g.Clear(Color.White); g.InterpolationMode = InterpolationMode.HighQualityBicubic; g.SmoothingMode = SmoothingMode.HighQuality; //g.PixelOffsetMode = PixelOffsetMode.HighQuality; g.CompositingQuality = CompositingQuality.HighQuality; //Rectangle destRect = new Rectangle(0, 0, destWidth, destHeight); //Rectangle srcRect = new Rectangle(x, y, cutWidth, cutHeight); g.FillRectangle(Brushes.White, 0, 0, destWidth, destHeight); g.DrawImage(model.Source, 0, 0, destWidth, destHeight); //g.DrawImage(model.Source, destRect, srcRect, GraphicsUnit.Pixel); if (model.IsWartermarked)//是否加水印 { Image warterMark = model.ImageWartermark; bool doImageWartermark = (null != warterMark && warterMark.Width < destWidth / 1 && warterMark.Height < destHeight / 1);//能否图片水印 if (doImageWartermark) { #region 图片水印 GetWatermarkPlacement(model.Position, g.DpiX, g.DpiY, destWidth, destHeight, warterMark, out x, out y); /* * ImageAttributes ia = new ImageAttributes(); * ColorMatrix cm = new ColorMatrix(); * cm.Matrix33 = 0.75f; * ia.SetColorMatrix(cm); */ ImageAttributes ia = new ImageAttributes(); //The first step in manipulating the watermark image is to replace //the background color with one that is trasparent (Alpha=0, R=0, G=0, B=0) //to do this we will use a Colormap and use this to define a RemapTable ColorMap colorMap = new ColorMap(); //My watermark was defined with a background of 100% Green this will //be the color we search for and replace with transparency colorMap.OldColor = Color.FromArgb(255, 0, 255, 0); colorMap.NewColor = Color.FromArgb(0, 0, 0, 0); ColorMap[] remapTable = { colorMap }; ia.SetRemapTable(remapTable, ColorAdjustType.Bitmap); //The second color manipulation is used to change the opacity of the //watermark. This is done by applying a 5x5 matrix that contains the //coordinates for the RGBA space. By setting the 3rd row and 3rd column //to 0.3f we achive a level of opacity 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 wmColorMatrix = new ColorMatrix(colorMatrixElements); ia.SetColorMatrix(wmColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); g.DrawImage(warterMark, new Rectangle(x, y, warterMark.Width, warterMark.Height), 0, 0, warterMark.Width, warterMark.Height, GraphicsUnit.Pixel, ia); warterMark.Dispose(); #endregion } else { #region 文字水印 int[] sizes = new int[] { 18, 16, 14, 12, 10, 8, 6, 4 }; Font font = null; SizeF size = new SizeF(); for (int i = 0; i < 8; i++)//自动适应大小 { font = new Font("arial", sizes[i], FontStyle.Bold); size = g.MeasureString(model.TextWatermark, font); if ((ushort)size.Width < (ushort)destWidth * .90) { break; } } float fx = destWidth * .95f - size.Width; float fy = destHeight * .99f - size.Height; StringFormat StrFormat = new StringFormat(); StrFormat.Alignment = StringAlignment.Near; //黑色阴影 (Alpha 153) SolidBrush brush1 = new SolidBrush(Color.FromArgb(153, 0, 0, 0)); g.DrawString(model.TextWatermark, font, brush1, new PointF(fx + 1, fy + 1), StrFormat); //白色前景 (Alpha 153) SolidBrush brush2 = new SolidBrush(Color.FromArgb(153, 255, 255, 255)); g.DrawString(model.TextWatermark, font, brush2, new PointF(fx, fy), StrFormat); #endregion } } g.Flush(); } model.Source.Dispose(); return(imgResult); }