/// <summary> /// 给二进制流添加水印文字并返回 /// </summary> /// <param name="photo">二进制流</param> /// <param name="watermarkText">水印文字</param> /// <param name="watermarkStatus">图片水印位置 0=不使用 1=左上 2=中上 3=右上 4=左中 9=右下</param> /// <param name="quality">附加水印图片质量,0-100</param> /// <param name="fontsize">字体大小</param> /// <param name="fontname">字体</param> /// <returns></returns> public byte[] AddWaterText(Byte[] photo, string watermarkText, int watermarkStatus, int quality, int fontsize, string fontname) { Image img = Image.FromStream(new System.IO.MemoryStream(photo)); //将图片流转换为缩略图并固定尺寸 Image.GetThumbnailImageAbort callb = new Image.GetThumbnailImageAbort(ThumbnailCallback); Image imgs=img.GetThumbnailImage(300, 300, callb, IntPtr.Zero); Graphics grap = Graphics.FromImage(imgs); Font drawFont = new Font(fontname, fontsize, FontStyle.Regular, GraphicsUnit.Pixel); SizeF crSize; crSize = grap.MeasureString(watermarkText, drawFont); float xpos = 0; float ypos = 0; switch (watermarkStatus) { case 1: xpos = (float)imgs.Width * (float).01; ypos = (float)imgs.Height * (float).01; break; case 2: xpos = ((float)imgs.Width * (float).50) - (crSize.Width / 2); ypos = (float)imgs.Height * (float).01; break; case 3: xpos = ((float)imgs.Width * (float).99) - crSize.Width; ypos = (float)imgs.Height * (float).01; break; case 4: xpos = (float)imgs.Width * (float).01; ypos = ((float)imgs.Height * (float).50) - (crSize.Height / 2); break; case 5: xpos = ((float)imgs.Width * (float).50) - (crSize.Width / 2); ypos = ((float)imgs.Height * (float).50) - (crSize.Height / 2); break; case 6: xpos = ((float)imgs.Width * (float).99) - crSize.Width; ypos = ((float)imgs.Height * (float).50) - (crSize.Height / 2); break; case 7: xpos = (float)imgs.Width * (float).01; ypos = ((float)imgs.Height * (float).99) - crSize.Height; break; case 8: xpos = ((float)imgs.Width * (float).50) - (crSize.Width / 2); ypos = ((float)imgs.Height * (float).99) - crSize.Height; break; case 9: xpos = ((float)imgs.Width * (float).99) - crSize.Width; ypos = ((float)imgs.Height * (float).99) - crSize.Height; break; } grap.DrawString(watermarkText, drawFont, new SolidBrush(Color.Blue), xpos, ypos); byte[] bt = null; using (MemoryStream mostream = new MemoryStream()) { Bitmap bmp = new Bitmap(imgs); bmp.Save(mostream, System.Drawing.Imaging.ImageFormat.Png);//将图像以指定的格式存入缓存内存流 bt = new byte[mostream.Length]; mostream.Position = 0;//设置留的初始位置 mostream.Read(bt, 0, Convert.ToInt32(bt.Length)); } return bt; } 调用方式: //给二进制流加水印文字 byte[] imgData = AddWaterText(item.SignetName, "仅限预览", 5, 50, 15, "宋体"); ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- /// <summary> /// 将二进制流转换为base64 /// </summary> /// <param name="data"></param> /// <returns></returns> public string ByteToByte64String(byte[] data) { string img = Convert.ToBase64String(data); return img; } 调用方式: //二进制流转换为base64 byte[] imgData=new byte[0]; string imgBase64=this.ByteToByte64String(imgData); 前台界面显示 let img="data:image/png;base64,"+imgBase64 <img src=img/> -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- /// <summary> /// 图片转换二进制流方法 /// </summary> /// <param name="path">文件路径</param> /// <returns></returns> private byte[] Imgbytefromimg(string path) { //方式一 //FileStream f = new FileStream(path, FileMode.Open, FileAccess.Read); //Byte[] imgByte = new Byte[f.Length];//把图片转成 Byte型 二进制流 //f.Read(imgByte, 0, imgByte.Length);//把二进制流读入缓冲区 //f.Close(); //return imgByte; //方式二 byte[] bytes = System.IO.File.ReadAllBytes(path); //读取文件到byte数组 return bytes; }