二进制流操作

/// <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;
}