본문 바로가기

programming/C#

[WinForm] RichTextBox와 XML의 연동 (Text와 이미지 연동)

시나리오.
간단합니다. RichTextBox에 있는 텍스트와 이미지를 XML에 저장하고 다시 불러들이는 시라니로입니다.
주의사항!! 제가 지금 만든거는 순서대로 불러들이지 않습니다!! ㅠㅠ 지금 프로젝트 진행중이라 이거에만 매달릴 수 없어서 못하고있지만 꼭 시간나면 만들겠슴!!   방식만 참고하세요ㅠㅠ;;

  http://www.codeproject.com  <-요 사이트 다들 아시죠? 여기서 에디터는 가져왔습니다. 버튼만 2개 추가했슴죠 -0-;;

일단 전역으로 ArrayList와 byte[] 배열 변수를 선언하였습니다.

byte[] photo = null;   //Image 저장 변수

ArrayList bnt = new ArrayList();  //image 담는 ArrayList입니다. photo를 담는거지요. 이미지를 추가시켜줄때마다 ArrayList에 담아줍니다.

 private void tsbtnInsertPicture_Click(object sender, EventArgs e)

{

     using (OpenFileDialog dlg = new OpenFileDialog())

     {

         dlg.Title = "Insert picture";

         dlg.DefaultExt = "jpg";

         dlg.Filter = "Bitmap Files|*.bmp|JPEG Files|*.jpg|GIF Files|*.gif|All files|*.*";

         dlg.FilterIndex = 1;

         if (dlg.ShowDialog() == DialogResult.OK)

         {

            try

            {

                string strImagePath = dlg.FileName;

                Image img = Image.FromFile(strImagePath);

                Clipboard.SetDataObject(img);

                DataFormats.Format df;

                df = DataFormats.GetFormat(DataFormats.Bitmap);

                if (this.rtbDocument.CanPaste(df))

                {

                    this.rtbDocument.Paste(df);

 

                    photo = GetPhoto(dlg.FileName);   //photo에 담아두기

                    bnt.Add(photo);                   //ArrayList에 담기

                }

 

            }

            catch

            {

                MessageBox.Show("Unable to insert image.", "Error"MessageBoxButtons.OK, MessageBoxIcon.Error);

                    }

                }

            }

}





 여기서도 등장하는 포토함수~

public static byte[] GetPhoto(string filepath)   //이미지 저장 함수.

{

       FileStream stream = new FileStream(filepath, FileMode.Open, FileAccess.Read);

       BinaryReader reader = new BinaryReader(stream);

       byte[] photo = reader.ReadBytes((int)stream.Length);

       reader.Close();

       stream.Close();

       return photo;

  }









 Xml저장하는 버튼 코드입니다. DataSet을 만들고 테이블을 추가후 Column과 Row을 생성 후 텍스트와 이미지를 저장해주는 겁니다.

private void toolStripButton1_Click_1(object sender, EventArgs e)   //XML 저장

{

      DataSet ds = new DataSet();

      DataTable dt = new DataTable("myTable");

 

      DataColumn dc = new DataColumn("Content", typeof(string));  //본문내용

      dt.Columns.Add(dc);

 

      int imageCnt = bnt.Count;

 

      for (int i = 0; i < imageCnt; i++) //ArrayList에 담은 수만큼 Colmn생성

      {

          dc = new DataColumn("image" + i.ToString(), typeof(byte[]));  //이미지

          dt.Columns.Add(dc);

      }

 

     ds.Tables.Add(dt);

     DataRow dr = dt.NewRow();

 

     dr["Content"] = rtbDocument.Text;   //본문내용

 

     for (int i = 0; i < imageCnt; i++)  //ArrayList에 담은 수만큼 row에 이미지를 담음

     {

         dr[i+1] = bnt[i];          //이미지

     }

     ds.Tables["myTable"].Rows.Add(dr);

 

     SaveFileDialog save = new SaveFileDialog();

     save.Filter = "xml file (*.*)|*.*"; //파일 필터링

 

     if (save.ShowDialog() == DialogResult.OK)

     {

         ds.WriteXml(save.FileName);  //XML Write.

     }

}



xml을 로드 시켜주는 버튼 소스입니다. 
private void toolStripButton2_Click(object sender, EventArgs e)   //XML 로드

{

      OpenFileDialog dlg = new OpenFileDialog();

      dlg.DefaultExt = ".xml";  //기본 확장자

      dlg.Filter = "Xml Files(.xml)|*.xml"; // 확장 파일 필터

      dlg.ShowDialog();

 

      DataSet ds = new DataSet();

 

      try

      {

          ds.ReadXml(dlg.FileName);

          LoadXml(ds);  // XML 읽어주기 함수

      }

      catch { }

}

 

private void LoadXml(DataSet ds)  // XML 읽어주기 함수

{

      byte[] myData = null;

 

      string str;

      MemoryStream mem;

      Bitmap bmp;

 

      foreach (DataTable table in ds.Tables)

      {

          foreach (DataRow row in table.Rows)

          {

              rtbDocument.Text = row[0] as string;

              for (int i = 0; i < table.Columns.Count; i++)
              {
                  str = row["Image" + i.ToString()].ToString();
                  myData = Convert.FromBase64String(str); //byte[] 컨버트해줌
                  mem = new MemoryStream(myData);
                  bmp = new Bitmap(mem); //byte[] -> bitmap변환
                  Clipboard.Clear();
                  Clipboard.SetImage(bmp);
                  rtbDocument.Paste();

              }

          }

      }
}



p.s 지금 피곤해서 빼먹은게 있으려나 -,,- 그리고,
순서대로 담는 방법을 아시는분!! 알려주십시오!!!ㅠㅠ 하악하악ㅠㅠ