图片 二进制 互转

图像二进制文件的操作(asp.net)

一、操作要点:

  • 将文件转换为二进制,再将二进制转回为文件
  • 将文件写入到XML,再读出来显示或者还原
  • 将文件写入到数据库,再读取出来显示或者还原

二、学习知识点:

二进制操作的类:FileStream(文件流)、BinaryReader(二进制流读取器)、BinaryWriter(二进制流写入器)

三、操作步骤:

(1)新建类:fileToData.cs

using System.IO;
/// <summary>
/// fileToData 的摘要说明
/// </summary>
public class fileToData
{
 public fileToData() //构造函数
 { }
/// <summary>
/// 将传进来的文件转换成字符串(二进制)
/// </summary>
    /// <param name=" FilePath">待处理的文件路径</param>
/// <returns>String</returns>
    public static string FileToBinary(string FilePath)
    {
        FileStream fs=new FileStream(FilePath,FileMode.Open,FileAccess.Read);
        //利用新传来的路径实例化一个FileStream对象
        int filelength = Convert.ToInt32(fs.Length);
        //得到对象的大小
        Byte[] filebyteArray=new byte[filelength];
        //申明一个byte数组
        BinaryReader br = new BinaryReader(fs);
        //申明一个读取二进制流的BinaryReader对象
        for (int i = 0; i < filelength; i++)
        {   //循环数组大小那么多次
            br.Read(filebyteArray, 0, filelength); //第一个数组用0表示
            //将数据读取出来放在数组中
        }

string strData = Convert.ToBase64String(filebyteArray);  //8位无符号整数数组ToBase64
        //将数组转换为String字符传
        return strData;
    }
    /// <summary>
    /// 将传进来的二进制字符串转换为图片文件
    /// </summary>
    /// <param name="path">保存的路径</param>
    /// <param name="Binary">需要转换的字符串</param>
    public static void BinaryToFile(string path,string Binary)
    {
        FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);
        //利用新传来的路径实例化一个FileStream对象
        BinaryWriter bw = new BinaryWriter(fs);
        //实例化一个用于写的 BinaryWriter
        bw.Write(Convert.FromBase64String(Binary));
        //将传近来的二进制字符转换为8位无符号整数数组再写进去
        bw.Close();   //关闭二进制流写入器
        fs.Close();  //关闭文件流
    }
}

(2)将文件转换为二进制及二进制转换为文件的实现(ToBinary.aspx):

public partial class toBinary : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string a=fileToData.FileToBinary(Server.MapPath("~/图片1.gif")); //将图片1转换为二进制
        fileToData.BinaryToFile(Server.MapPath("~/图片2.gif"), a); //将二进制转换为图片2
    }
}
(3)新建类:FileToxml.cs

加入命名空间:using System.IO;using System.Text;using System.Xml;

/// <summary>
/// 将文件转换为二进制
/// </summary>
public class FileToxml
{
 public FileToxml()
 {
 }
    /// <summary>
    /// 从上传控件中
    /// </summary>
    /// <param name="fu">被加载了文件的FileUpload上传控件</param>
    /// <param name="xmlPath">XML文件的存放位置</param>
    /// <param name="id">图片的标识ID</param>
    public static void FileToXML(FileUpload fu,string xmlPath,Guid id)
    {
        if (fu.HasFile)
        { //先判断FileUpload对象中是否包含了文件
            string PathString = fu.FileName; 
            int FileLength = fu.PostedFile.ContentLength;  //只得出带扩展名的文件名

try
            {
                Byte[] FileByteArray = new byte[FileLenght];
                //申明一个大小为文件总字节大的Byte数组以存放即将产生的二进制数据

Stream Streamobj = fu.PostedFile.InputStream;
                //创建一个能够读取被上载文件内容的Stream对象

Streamobj.Read(FileByteArray, 0, FileLength);
                //使用Stream对象的读取方法,参数说明将数据流存放在刚才申明的数组中,从0开始读,读取的字节数为全部

XmlDocument xdom = new XmlDocument();

if (!File.Exists(xmlPath))
                {  //如果不存在XML,则创建

XmlDeclaration xdec = xdom.CreateXmlDeclaration("1.0", "utf-8", null);
                    xdom.AppendChild(xdec);                             //创建第一行声明

XmlElement Root = xdom.CreateElement("File");          //创建根节点File
                    xdom.AppendChild(Root);

XmlElement RootElement = xdom.CreateElement("Image"); //创建父节点Image
                    Root.AppendChild(RootElement);

XmlElement childElementId = xdom.CreateElement("Guid");    //图片标识字段
                    childElementId.InnerText = id.ToString();
                    //将传近来的GUID编号作为他的串联值
                    RootElement.AppendChild(childElementId);

XmlElement childElementImgSize = xdom.CreateElement("size");//文件大小字段
                    childElementImgSize.InnerText = FileLength.ToString(); 
                    RootElement.AppendChild(childElementImgSize);

XmlElement childElementImgData = xdom.CreateElement("imgData"); //图片信息
                    childElementImgData.InnerText = Convert.ToBase64String(FileByteArray);
                    //这句是关键,将上面的数组转换为字符串存起来
                    RootElement.AppendChild(childElementImgData);

xdom.Save(xmlPath);
                    //将上面创建的构架保存到指定的xml文件中
                }
                else
                {  //如果XML文件存在的话就直接查找对应的节点,然后增加
                    xdom.Load(xmlPath); //加载xml文档
                    //将指定的XML文件读取到XMLdocument对象中

XmlNode root = xdom.SelectSingleNode("File");
                    //使用xpath表达式来查找到匹配条件的节点,我们这里当然是指根节点了

XmlElement RootElement = xdom.CreateElement("Image");
                    root.AppendChild(RootElement);
                    //创建父节点

XmlElement childElementId = xdom.CreateElement("Guid");//图片标识字段
                   childElementId.InnerText = id.ToString();//将传近来的GUID编号作为他的串联值
                    RootElement.AppendChild(childElementId);

XmlElement childElementImgSize = xdom.CreateElement("size");
                    childElementImgSize.InnerText = FileLenght.ToString();//文件大小字段
                    RootElement.AppendChild(childElementImgSize);

XmlElement childElementImgData = xdom.CreateElement("imgData");
                    childElementImgData.InnerText = Convert.ToBase64String(fu.FileBytes);
                    RootElement.AppendChild(childElementImgData);

xdom.Save(xmlPath);
                    //将上面创建的构架保存到指定的xml文件中
                }
            }
            catch (Exception e)
            {
                throw e;
            }
        }
    }
}
(4)将图像文件写入到XML,再读出来显示或者还原(fileToxml.aspx):

public partial class fileToxml : System.Web.UI.Page
{
    protected void Button1_Click(object sender, EventArgs e)
    {//(上传按钮)将文件写入XML中去
        string xmlpath = Server.MapPath("~/App_Data/imgxml.xml");
        Guid gid = Guid.NewGuid();
        FileToxml.FileToXML(FileUpload1, xmlpath, gid);

Session["gid"] = gid;
    }
    protected void Button2_Click(object sender, EventArgs e)
    { //根据Gid索取图片来显示
       ReadImgFromXml((Guid)Session["gid"]);
    }
    private void ReadImgFromXml(Guid gid)
    {
        XmlDocument xdom = new XmlDocument();
        xdom.Load(Server.MapPath("~/App_Data/imgxml.xml"));

XmlNodeList xnl = xdom.SelectSingleNode(" //Image[Guid=‘" + gid.ToString() + "‘]").ChildNodes;  //找出GUID=我们传进来的ID的那一个节点的所有子节点
        for (int i = 0; i < xnl.Count; i++)
        {
            string imgdata = xnl.Item(2).InnerText; //节点第三项imgdata
            Response.OutputStream.Write(Convert.FromBase64String(imgdata), 0, imgdata.Length);
            Response.End();//从0开始到指定的长度输出打印所有的imgdata图像信息
        }
    }
    protected void Button3_Click(object sender, EventArgs e)
    { //从XML中读出再转换为文件
        XmlDocument xdom = new XmlDocument();
        xdom.Load(Server.MapPath("~/App_Data/imgxml.xml"));

XmlNodeList xnl = xdom.SelectSingleNode(" //Image[Guid=‘" + Session["gid"].ToString() + "‘]" ).ChildNodes;
        for (int i = 0; i < xnl.Count; i++)
        {
            string strData = xnl.Item(2).InnerText;
            FileStream fs = new FileStream(Server.MapPath("~/图像文件名.gif"), FileMode.Create, FileAccess.Write);
            BinaryWriter bw = new BinaryWriter(fs);
            bw.Write(Convert.FromBase64String(strData));
            bw.Close();
            fs.Close();
        }
        Image1.ImageUrl = "~/图像文件名.gif";
    }
}
(5)将图像文件写入到数据库,再读取出来显示或者还原(ToData.aspx)

public partial class ToData : System.Web.UI.Page
{
    protected void Button1_Click(object sender, EventArgs e)
    {

Guid gid=Guid.NewGuid();
        SqlConnection conn=new SqlConnection(ConfigurationManager.ConnectionStrings["数据源名称"].ConnectionString);
        conn.Open();
        //注意:二进制不能采用字符串相加的方式写入数据库

SqlCommand cmd = new SqlCommand("Insert into img(gid,fileData) values(@gid ,@fileArray) ", conn);  //新建一个表img,添加字段名gid,fileData,下面添加字段类型
        cmd.Parameters.Add(" @gid", SqlDbType.UniqueIdentifier).Value = gid;
        cmd.Parameters.Add(" @fileArray", SqlDbType.Image).Value = FileUpload1.FileBytes;
        cmd.ExecuteNonQuery(); //执行SQL语句,返回影响行数
        conn.Close();

Session["gid"] = gid; //保存gid的值
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["数据源名称"].ConnectionString);
        conn.Open();
        SqlCommand cmd = new SqlCommand("select fileDat from img where gid=‘"+Session["gid"].ToString()+"‘" , conn);
        byte[] fbt=(byte[])cmd.ExecuteScalar();
        conn.Close();

Response.OutputStream.Write(fbt, 0, fbt.Length);
        Response.End();

}
}

时间: 2024-08-29 05:19:18

图片 二进制 互转的相关文章

C# 文件与二进制互转数据库写入读出

//这个方法是浏览文件对象 private void button1_Click(object sender, EventArgs e) { //用户打开文件浏览 using (OpenFileDialog dialog = new OpenFileDialog()) { //只能单选一个文件 dialog.Multiselect = false; //选择一个文件 if (dialog.ShowDialog() == DialogResult.OK) { try { //把选择的文件路径给tx

使用HTML5的File实现base64和图片的互转

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

算法练习--十进制 二进制互转

//2->10 var b2i = function(b){ var strB = b.toString(); var sum = 0; for(var i = 0; i<strB.length ;i++){ sum += Math.pow(2,strB.length - i-1) * strB[i]; } return sum; } //10 -> 2 var r = ""; var i2b = function f(i){ if(i ==0 || i == 1){

.net 根据图片网络地址获取图片二进制字节数据流

/// <summary> ///根据html路径获取图片的字节 /// </summary> /// <param name="picSize">图片尺寸,原图:1,大图:2,中图:3,小图:4</param> /// <param name="serverPath">图片服务器地址</param> /// <returns></returns> public stat

相册选择头像或者拍照 上传头像以NSData 图片二进制格式 表单上传

一.点击头像图片 或者按钮 在相册选择照片返回img,网络上传头像要用data表单上传 (1)上传头像属性 // 图片二进制格式 表单上传 @property (nonatomic, strong) NSData *imageWithData; (2)头像点击事件 - (void)headImageEvent{ NSLog(@"上传头像"); [self selectPhotoAlbumWithSelectPhotoHandle:^(UIImage *img) { self.heade

获得数据库image图片二进制

/// <summary>        /// 获得图片二进制        /// </summary>        /// <param name="unit_sn">登录用户名</param>        /// <returns></returns>        public string GetNameImageFromEmr(string unit_sn)        {           

任意类型和二进制互转工具类

1 public class SerializeUtil { 2 /** 3 * 任意类型和二进制互转 4 * @param obj 5 * @return 6 */ 7 public static byte [] serialize(Object obj){ 8 ObjectOutputStream obi=null; 9 ByteArrayOutputStream bai=null; 10 try { 11 bai=new ByteArrayOutputStream(); 12 obi=ne

C# 二进制图片串互转

C# byte数组与Image的相互转换 功能需求: 1.把一张图片(png bmp jpeg bmp gif)转换为byte数组存放到数据库. 2.把从数据库读取的byte数组转换为Image对象,赋值给相应的控件显示. 3.从图片byte数组得到对应图片的格式,生成一张图片保存到磁盘上. 这里的Image是System.Drawing.Image. 1 //Get an image from file 2 Image image = Image.FromFile("D:\\test.jpg&

java图片二进制相互转换

import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encode