關於RTF提取圖片和文字的方法 (轉)
阿新 • • 發佈:2019-01-05
儲存rtf有時候需要實現RTF文字和圖片分離。rtf文字可以通過RICHTEXTBOX.TEXT而獲取。但是圖片的話需要分離。
實現原理:
原來儲存在RTF格式中的圖片資料(圖片資料位置請參閱RTF格式研究這篇文章)是把原圖片的16進位制資料直接變成ascii字元資料嵌入RTF檔案中的
也就是:
&H432D(一共16bit資料長度)變成了"432D"(一共32bit資料)字串儲存在檔案中,我們要做的是把字串再轉回16進位制數
========================================================
只要定義一個位元組陣列B() as byte
每兩個字元從RTF圖片資料中讀出//2個字元16bit大小
通過val等函式轉換成數值//十進位制,因為16進位制在vb比較難操作,所以選擇數值相同的十進位制,存進去變數以後的2進位制是一樣的
儲存在B(i)中//8bit(把2個字元壓成一個字元拉....)
然後用vb的二進位制方式binary
寫入整個B()陣列到檔案
然後通過任何圖片程式就可以讀取拉
分離程式碼如下:
string cmd = "select QUESTION_CONTENT from TB_QUESTION where QUESTION_ID='TK11042900284'";
tempStr = SQLDAL.OracleHelper.GetSingle(cmd);
//資料庫讀出的RTF字串。
string _RtfText = tempStr;
IList<string> _ImageList = new List<string>();
while (true)
{
int _Index = _RtfText.IndexOf("pichgoal");
if (_Index == -1) break;
_RtfText = _RtfText.Remove(0, _Index + 8);
_Index = _RtfText.IndexOf("\r\n");
_RtfText = _RtfText.Remove(0, _Index);
_Index = _RtfText.IndexOf("}");
_ImageList.Add(_RtfText.Substring(0, _Index).Replace("\r\n", ""));
_RtfText = _RtfText.Remove(0, _Index);
}
Byte[] buffer;
buffer = null;
for (int i = 0; i != _ImageList.Count; i++)
{
// System.IO.FileStream _File = new FileStream(System.Windows.Forms.Application.StartupPath + "\\" + i.ToString() + ".dat", System.IO.FileMode.Create);
int _Count = _ImageList[i].Length / 2;
buffer = new Byte[_ImageList[i].Length/2];
for (int z = 0; z != _Count; z++)
{
string _TempText = _ImageList[i][z * 2].ToString() + _ImageList[i][(z * 2) + 1].ToString();
// _File.WriteByte(Convert.ToByte(_TempText, 16));
buffer[z] = Convert.ToByte(_TempText, 16);
}
// _File.Close();
}
MemoryStream ms = new MemoryStream(buffer);
Image _a = Image.FromStream(ms);
// Bitmap _a = new Bitmap(Application.StartupPath + "\\" + "0.dat");
if (_a != null)
{
pictureBox1.Image = _a;
}
else
{
MessageBox.Show("as");
實現原理:
原來儲存在RTF格式中的圖片資料(圖片資料位置請參閱RTF格式研究這篇文章)是把原圖片的16進位制資料直接變成ascii字元資料嵌入RTF檔案中的
也就是:
&H432D(一共16bit資料長度)變成了"432D"(一共32bit資料)字串儲存在檔案中,我們要做的是把字串再轉回16進位制數
========================================================
只要定義一個位元組陣列B() as byte
每兩個字元從RTF圖片資料中讀出//2個字元16bit大小
通過val等函式轉換成數值//十進位制,因為16進位制在vb比較難操作,所以選擇數值相同的十進位制,存進去變數以後的2進位制是一樣的
儲存在B(i)中//8bit(把2個字元壓成一個字元拉....)
然後用vb的二進位制方式binary
寫入整個B()陣列到檔案
然後通過任何圖片程式就可以讀取拉
分離程式碼如下:
string cmd = "select QUESTION_CONTENT from TB_QUESTION where QUESTION_ID='TK11042900284'";
tempStr = SQLDAL.OracleHelper.GetSingle(cmd);
//資料庫讀出的RTF字串。
string _RtfText = tempStr;
IList<string> _ImageList = new List<string>();
while (true)
{
int _Index = _RtfText.IndexOf("pichgoal");
if (_Index == -1) break;
_RtfText = _RtfText.Remove(0, _Index + 8);
_Index = _RtfText.IndexOf("\r\n");
_RtfText = _RtfText.Remove(0, _Index);
_Index = _RtfText.IndexOf("}");
_ImageList.Add(_RtfText.Substring(0, _Index).Replace("\r\n", ""));
_RtfText = _RtfText.Remove(0, _Index);
}
Byte[] buffer;
buffer = null;
for (int i = 0; i != _ImageList.Count; i++)
{
// System.IO.FileStream _File = new FileStream(System.Windows.Forms.Application.StartupPath + "\\" + i.ToString() + ".dat", System.IO.FileMode.Create);
int _Count = _ImageList[i].Length / 2;
buffer = new Byte[_ImageList[i].Length/2];
for (int z = 0; z != _Count; z++)
{
string _TempText = _ImageList[i][z * 2].ToString() + _ImageList[i][(z * 2) + 1].ToString();
// _File.WriteByte(Convert.ToByte(_TempText, 16));
buffer[z] = Convert.ToByte(_TempText, 16);
}
// _File.Close();
}
MemoryStream ms = new MemoryStream(buffer);
Image _a = Image.FromStream(ms);
// Bitmap _a = new Bitmap(Application.StartupPath + "\\" + "0.dat");
if (_a != null)
{
pictureBox1.Image = _a;
}
else
{
MessageBox.Show("as");
}
轉自:http://haitaowang.blog.163.com/blog/static/128023119201151531653861/
參考:http://bbs.csdn.net/topics/290072647