图片编辑类

it2025-03-21  17

using  System; using  System.Drawing; using  System.IO; /**/ /// <summary>/// ImgEdit 的摘要说明/// </summary> public   class  ImgEdit {    public ImgEdit()    {        //        // TODO: 在此处添加构造函数逻辑        //    }    /**//// <summary>    /// 图片水印    /// </summary>    /// <param name="ImgFile">原图文件地址</param>    /// <param name="WaterImg">水印图片地址</param>    /// <param name="sImgPath">水印图片保存地址</param>    /// <param name="Alpha">水印透明度设置</param>    /// <param name="iScale">水印图片在原图上的显示比例(水平)</param>    /// <param name="intDistance">水印图片在原图上的边距确定,以图片的右边和下边为准,当设定的边距超过一定大小后参数会自动失效</param>    public bool ImgWater(string ImgFile, string WaterImg, string sImgPath, float Alpha, float iScale, int intDistance)    {        try        {            //装载图片            FileStream fs = new FileStream(ImgFile, FileMode.Open);            BinaryReader br = new BinaryReader(fs);            byte[] bytes = br.ReadBytes((int)fs.Length);            br.Close();            fs.Close();            MemoryStream ms = new MemoryStream(bytes);            System.Drawing.Image imgPhoto = System.Drawing.Image.FromStream(ms);            int imgPhotoWidth = imgPhoto.Width;            int imgPhotoHeight = imgPhoto.Height;            System.Drawing.Image imgWatermark = new Bitmap(WaterImg);            int imgWatermarkWidth = imgWatermark.Width;            int imgWatermarkHeight = imgWatermark.Height;            //计算水印图片尺寸            decimal aScale = Convert.ToDecimal(iScale);            decimal pScale = 0.05M;            decimal MinScale = aScale - pScale;            decimal MaxScale = aScale + pScale;            //设置比例            int imgWatermarkWidthNew = Convert.ToInt32(imgPhotoWidth * aScale);            int imgWatermarkHeightNew = Convert.ToInt32((imgPhotoWidth * aScale / imgWatermarkWidth) * imgWatermarkHeight);            //将原图画出来            Bitmap bmPhoto = new Bitmap(imgPhotoWidth, imgPhotoHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);            bmPhoto.SetResolution(7272);            Graphics gbmPhoto = Graphics.FromImage(bmPhoto);            gbmPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;            gbmPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;            gbmPhoto.Clear(Color.White);            gbmPhoto.DrawImage(imgPhoto, new Rectangle(00, imgPhotoWidth, imgPhotoHeight), 00, imgPhotoWidth, imgPhotoHeight, GraphicsUnit.Pixel);            Bitmap bmWatermark = new Bitmap(bmPhoto);            bmWatermark.SetResolution(imgPhoto.HorizontalResolution, imgPhoto.VerticalResolution);            Graphics gWatermark = Graphics.FromImage(bmWatermark);            //指定高质量显示水印图片质量            gWatermark.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;            gWatermark.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;            System.Drawing.Imaging.ImageAttributes imageAttributes = new System.Drawing.Imaging.ImageAttributes();            //设置两种颜色,达到合成效果            System.Drawing.Imaging.ColorMap colorMap = new System.Drawing.Imaging.ColorMap();            colorMap.OldColor = Color.FromArgb(25502550);            colorMap.NewColor = Color.FromArgb(0000);            System.Drawing.Imaging.ColorMap[] remapTable = { colorMap };            imageAttributes.SetRemapTable(remapTable, System.Drawing.Imaging.ColorAdjustType.Bitmap);            //用矩阵设置水印图片透明度            float[][] colorMatrixElements = {                new float[] {1.0f,  0.0f,  0.0f,  0.0f0.0f},               new float[] {0.0f,  1.0f,  0.0f,  0.0f0.0f},               new float[] {0.0f,  0.0f,  1.0f,  0.0f0.0f},               new float[] {0.0f,  0.0f,  0.0f,  Alpha, 0.0f},               new float[] {0.0f,  0.0f,  0.0f,  0.0f1.0f}            };            System.Drawing.Imaging.ColorMatrix wmColorMatrix = new System.Drawing.Imaging.ColorMatrix(colorMatrixElements);            imageAttributes.SetColorMatrix(wmColorMatrix, System.Drawing.Imaging.ColorMatrixFlag.Default, System.Drawing.Imaging.ColorAdjustType.Bitmap);            //确定水印边距            int xPos = imgPhotoWidth - imgWatermarkWidthNew;            int yPos = imgPhotoHeight - imgWatermarkHeightNew;            int xPosOfWm = 0;            int yPosOfWm = 0;            if (xPos > intDistance)                xPosOfWm = xPos - intDistance;            else                xPosOfWm = xPos;            if (yPos > intDistance)                yPosOfWm = yPos - intDistance;            else                yPosOfWm = yPos;            gWatermark.DrawImage(imgWatermark, new Rectangle(xPosOfWm, yPosOfWm, imgWatermarkWidthNew, imgWatermarkHeightNew), 00, imgWatermarkWidth, imgWatermarkHeight, GraphicsUnit.Pixel, imageAttributes);            imgPhoto = bmWatermark;            imgPhoto.Save(sImgPath, System.Drawing.Imaging.ImageFormat.Jpeg);            //销毁对象            gbmPhoto.Dispose();            gWatermark.Dispose();            imgPhoto.Dispose();            imgWatermark.Dispose();            return true;        }        catch (Exception ex)        {            return false;        }    }    /**//// <summary>    /// 文字水印    /// </summary>    /// <param name="ImgFile">原图文件地址</param>    /// <param name="TextFont">水印文字</param>    /// <param name="sImgPath">文字水印图片保存地址</param>    /// <param name="Alpha">文字透明度 其数值的范围在0到255</param>    /// <param name="widthFont">文字块在图片中所占宽度比例</param>    /// <param name="hScale">高度位置</param>    public bool TextWater(string ImgFile, string TextFont, string sImgPath, int Alpha, float widthFont, float hScale)    {        try        {            FileStream fs = new FileStream(ImgFile, FileMode.Open);            BinaryReader br = new BinaryReader(fs);            byte[] bytes = br.ReadBytes((int)fs.Length);            br.Close();            fs.Close();            MemoryStream ms = new MemoryStream(bytes);            System.Drawing.Image imgPhoto = System.Drawing.Image.FromStream(ms);            int imgPhotoWidth = imgPhoto.Width;            int imgPhotoHeight = imgPhoto.Height;            Bitmap bmPhoto = new Bitmap(imgPhotoWidth, imgPhotoHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);            bmPhoto.SetResolution(7272);            Graphics gbmPhoto = Graphics.FromImage(bmPhoto);            gbmPhoto.Clear(Color.FromName("white"));//gif背景色            gbmPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;            gbmPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;            gbmPhoto.DrawImage(imgPhoto, new Rectangle(00, imgPhotoWidth, imgPhotoHeight), 00, imgPhotoWidth, imgPhotoHeight, GraphicsUnit.Pixel);            //建立字体大小的数组,循环找出适合图片的水印字体            int[] sizes = new int[] 100080070065060056054050045040038036034032030028026024022020018016014012010080726448322826242028161412108642 };            System.Drawing.Font crFont = null;            System.Drawing.SizeF crSize = new SizeF();            for (int i = 0; i < 43; i++)            {                crFont = new Font("arial", sizes[i], FontStyle.Bold);                crSize = gbmPhoto.MeasureString(TextFont, crFont);                if ((ushort)crSize.Width < (ushort)imgPhotoWidth * widthFont)                    break;            }            //设置水印字体的位置            int yPixlesFromBottom = (int)(imgPhotoHeight * hScale);            float yPosFromBottom = ((imgPhotoHeight - yPixlesFromBottom) - (crSize.Height / 2));            float xCenterOfImg = (imgPhotoWidth * 1 / 2);            System.Drawing.StringFormat StrFormat = new System.Drawing.StringFormat();            StrFormat.Alignment = System.Drawing.StringAlignment.Center;            //画两次制造透明效果            System.Drawing.SolidBrush semiTransBrush2 = new System.Drawing.SolidBrush(Color.FromArgb(Alpha, 000));            gbmPhoto.DrawString(TextFont, crFont, semiTransBrush2, new System.Drawing.PointF(xCenterOfImg + 1, yPosFromBottom + 1), StrFormat);            System.Drawing.SolidBrush semiTransBrush = new System.Drawing.SolidBrush(Color.FromArgb(Alpha, 255255255));            gbmPhoto.DrawString(TextFont, crFont, semiTransBrush, new System.Drawing.PointF(xCenterOfImg, yPosFromBottom), StrFormat);            bmPhoto.Save(sImgPath, System.Drawing.Imaging.ImageFormat.Jpeg);            gbmPhoto.Dispose();            imgPhoto.Dispose();            bmPhoto.Dispose();            return true;        }        catch (Exception ex)        {            return false;        }    }    /**//// <summary>    /// 缩略图    /// </summary>    /// <param name="ImgFile">原图文件地址</param>    /// <param name="sImgPath">缩略图保存地址</param>    /// <param name="ResizeWidth">缩略图宽度</param>    /// <param name="ResizeHeight">缩略图高度</param>    /// <param name="BgColor">缩略图背景颜色,注意,背景颜色只能指定KnownColor中的值,如white,blue,red,green等</param>    public bool ResizeImg(string ImgFile, string sImgPath, int ResizeWidth, int ResizeHeight, string BgColor)    {        try        {            FileStream fs = new FileStream(ImgFile, FileMode.Open);            BinaryReader br = new BinaryReader(fs);            byte[] bytes = br.ReadBytes((int)fs.Length);            br.Close();            fs.Close();            MemoryStream ms = new MemoryStream(bytes);            System.Drawing.Image imgPhoto = System.Drawing.Image.FromStream(ms);            int imgPhotoWidth = imgPhoto.Width;            int imgPhotoHeight = imgPhoto.Height;            int StartX = 0;            int StartY = 0;            int NewWidth = imgPhotoWidth;            int NewHeight = imgPhotoHeight;            //计算缩放图片尺寸            if (NewWidth > ResizeWidth)            {                NewWidth = ResizeWidth;                NewHeight = Convert.ToInt32(imgPhotoHeight * Math.Round(Convert.ToDecimal(NewWidth) / Convert.ToDecimal(imgPhotoWidth), 10));            }            if (NewHeight > ResizeHeight)            {                NewHeight = ResizeHeight;                NewWidth = Convert.ToInt32(imgPhotoWidth * Math.Round(Convert.ToDecimal(NewHeight) / Convert.ToDecimal(imgPhotoHeight), 10));            }            StartX = ResizeWidth - NewWidth;            StartY = ResizeHeight - NewHeight;            StartX = StartX > 0 ? StartX / 2 : 0;            StartY = StartY > 0 ? StartY / 2 : 0;            Bitmap bmPhoto = new Bitmap(ResizeWidth, ResizeHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);            bmPhoto.SetResolution(7272);            Graphics gbmPhoto = Graphics.FromImage(bmPhoto);            gbmPhoto.Clear(Color.FromName(BgColor));            gbmPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;            gbmPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;            gbmPhoto.DrawImage(imgPhoto, new Rectangle(StartX, StartY, NewWidth, NewHeight), new Rectangle(00, imgPhotoWidth, imgPhotoHeight), GraphicsUnit.Pixel);            bmPhoto.Save(sImgPath, System.Drawing.Imaging.ImageFormat.Jpeg);            imgPhoto.Dispose();            gbmPhoto.Dispose();            bmPhoto.Dispose();            return true;        }        catch (Exception err)        {            return false;        }    }    /**//// <summary>    /// 图片剪切    /// </summary>    /// <param name="ImgFile">原图文件地址</param>    /// <param name="sImgPath">缩略图保存地址</param>    /// <param name="PointX">剪切起始点 X坐标</param>    /// <param name="PointY">剪切起始点 Y坐标</param>    /// <param name="CutWidth">剪切宽度</param>    /// <param name="CutHeight">剪切高度</param>    public bool CutImg(string ImgFile, string sImgPath, int PointX, int PointY, int CutWidth, int CutHeight)    {        try        {            FileStream fs = new FileStream(ImgFile, FileMode.Open);            BinaryReader br = new BinaryReader(fs);            byte[] bytes = br.ReadBytes((int)fs.Length);            br.Close();            fs.Close();            MemoryStream ms = new MemoryStream(bytes);            System.Drawing.Image imgPhoto = System.Drawing.Image.FromStream(ms);            //System.Drawing.Image imgPhoto = System.Drawing.Image.FromFile(ImgFile);            //此处只能用filestream,用 System.Drawing.Image则会报多过进程访问文件的错误,会锁定文件            Bitmap bmPhoto = new Bitmap(CutWidth, CutHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);            bmPhoto.SetResolution(7272);            Graphics gbmPhoto = Graphics.FromImage(bmPhoto);            gbmPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;            gbmPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;            gbmPhoto.DrawImage(imgPhoto, new Rectangle(00, CutWidth, CutHeight), new Rectangle(PointX, PointY, CutHeight, CutHeight), GraphicsUnit.Pixel);            bmPhoto.Save(sImgPath, System.Drawing.Imaging.ImageFormat.Jpeg);            imgPhoto.Dispose();            gbmPhoto.Dispose();            bmPhoto.Dispose();            return true;        }        catch (Exception err)        {            return false;        }    }}

转载于:https://www.cnblogs.com/cloudgamer/articles/1098758.html

最新回复(0)