C# 将图像插入.NET中的富格文本文件
我正在尝试将图像插入到富文本文件中。我已经读了一些答案,但我不太明白。我使用的代码如下:C# 将图像插入.NET中的富格文本文件,c#,.net,image,rtf,C#,.net,Image,Rtf,我正在尝试将图像插入到富文本文件中。我已经读了一些答案,但我不太明白。我使用的代码如下: string[] imgfiles = Directory.GetFiles(dirin, "*.png"); foreach (string imageFileName in imgfiles) { var someImage = Image.FromFile(imageFileName);
string[] imgfiles = Directory.GetFiles(dirin, "*.png");
foreach (string imageFileName in imgfiles)
{
var someImage = Image.FromFile(imageFileName);
MemoryStream memStream = new MemoryStream();
someImage.Save(memStream, ImageFormat.Png);
byte[] imgbytedata = memStream.ToArray();
memStream.Close();
memStream.Dispose();
StringBuilder sb = new StringBuilder();
for(int i = 0; i < imgbytedata.Length; i++)
{
sb.Append(imgbytedata[i]);
}
var imgstr = "{" + string.Format("\\pict\\pngblip\\picw{0}\\pich{1}\\picwgoal{0}\\pichgoal{1}\\bin binary {2}", someImage.Width, someImage.Height, sb.ToString()) + "}";
sb = null;
rtb.AppendText(imgstr);
}
string[]imgfiles=Directory.GetFiles(dirin,*.png”);
foreach(imgfiles中的字符串imageFileName)
{
var someImage=Image.FromFile(imageFileName);
MemoryStream memStream=新的MemoryStream();
Save(memStream,ImageFormat.Png);
字节[]imgbytedata=memStream.ToArray();
memStream.Close();
memStream.Dispose();
StringBuilder sb=新的StringBuilder();
for(int i=0;i
当您从字节数组构建字符串时,您将附加字节数据的字符串版本,即“76”、“127”、“90”等
一个主要问题(我不知道这是否是您的实际问题)是,当您尝试读取它时,读者不知道如何从中提取字节。就拿这个例子来说
var c = new StringBuilder();
c.Append(6);
c.Append(64);
Console.WriteLine(c.ToString());
输出:
"664"
解决方案:使用Convert.ToBase64String
将字节数组转换为base64String,并将其存储在文件中
像这样
var c = Convert.ToBase64String(new byte[] {6, 64});
Console.WriteLine(c);
Console.WriteLine();
foreach (var entry in Convert.FromBase64String(c))
Console.WriteLine(entry);
输出
"BkA="
6
64
另一个潜在的问题是:我听说对异常大的字符串使用
string.Format
会导致问题。我可以理解这样一种情况,即使用大型图像文件生成内存异常
解决方案:不要使用
string.Format
。首先将标题附加到StringBuilder
,或者在两个单独的操作中写入标题和图像数据。从字节数组构建字符串时,将附加字节数据的字符串版本,即“76”、“127”、“90”等
一个主要问题(我不知道这是否是您的实际问题)是,当您尝试读取它时,读者不知道如何从中提取字节。就拿这个例子来说
var c = new StringBuilder();
c.Append(6);
c.Append(64);
Console.WriteLine(c.ToString());
输出:
"664"
解决方案:使用Convert.ToBase64String
将字节数组转换为base64String,并将其存储在文件中
像这样
var c = Convert.ToBase64String(new byte[] {6, 64});
Console.WriteLine(c);
Console.WriteLine();
foreach (var entry in Convert.FromBase64String(c))
Console.WriteLine(entry);
输出
"BkA="
6
64
另一个潜在的问题是:我听说对异常大的字符串使用
string.Format
会导致问题。我可以理解这样一种情况,即使用大型图像文件生成内存异常
解决方案:不要使用
string.Format
。可以先将标题附加到StringBuilder,也可以在两个单独的操作中写入标题和图像数据。不能以任何方式分隔字节值。例如,假设您的图像只有四个字节16、23、240和1,那么您会在字符串中附加“16232401”,这显然是错误的。我不知道RTF需要什么,但您需要分隔符或两位十六进制值或base64之类的
更新
RTF使用未分离的两位十六进制值,每128个字符(或64个字节)使用一个CR/LF。像这样的事情应该可以做到:
StringBuilder sb = new StringBuilder();
// TODO: Append image headers here.
// Then append image data:
for (int i = 0; i != imgbytedata.Length; ++i)
{
if ((i % 64) == 0)
{
sb.AppendLine();
}
sb.AppendFormat("{0:x2}", imgbytedata[i]);
}
您没有以任何方式分隔字节值。例如,假设您的图像只有四个字节16、23、240和1,那么您会在字符串中附加“16232401”,这显然是错误的。我不知道RTF需要什么,但您需要分隔符或两位十六进制值或base64之类的 更新 RTF使用未分离的两位十六进制值,每128个字符(或64个字节)使用一个CR/LF。像这样的事情应该可以做到:
StringBuilder sb = new StringBuilder();
// TODO: Append image headers here.
// Then append image data:
for (int i = 0; i != imgbytedata.Length; ++i)
{
if ((i % 64) == 0)
{
sb.AppendLine();
}
sb.AppendFormat("{0:x2}", imgbytedata[i]);
}
因此询问者希望将图像嵌入到RTF中 我想这会解决你的问题。用这个替换for循环
for(int i = 0; i < imgbytedata.Length; i++)
{
if (i % 64 == 0)
sb.Append(Environment.NewLine);
sb.Append(imgbytedata[i].ToString("X"));
}
for(int i=0;i
因此询问者希望将图像嵌入RTF
我想这会解决你的问题。用这个替换for循环
for(int i = 0; i < imgbytedata.Length; i++)
{
if (i % 64 == 0)
sb.Append(Environment.NewLine);
sb.Append(imgbytedata[i].ToString("X"));
}
for(int i=0;i
可能应该提及哪里出了问题,即您是否收到了一些异常或错误消息?您是否看到了我答案的更新?可能应该提及哪里出了问题,即您是否收到了一些异常或错误消息?您是否看到了我答案的更新?