我正在尝试将图像插入到富文本文件中。我已经阅读了一些答案,但我没有把它弄好。我使用的代码如下:
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);
}
答案 0 :(得分:2)
当您从字节数组构建字符串时,您将附加字节数据的字符串版本,即“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
或在两个单独的操作中写入标题和图像数据。
答案 1 :(得分:1)
您没有以任何方式分离字节值。例如,假设您的图像只有四个字节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]);
}
答案 2 :(得分:0)
因此提问者希望将图像嵌入到RTF中。
我认为这可以解决您的问题。用这个替换你的for循环。
for(int i = 0; i < imgbytedata.Length; i++)
{
if (i % 64 == 0)
sb.Append(Environment.NewLine);
sb.Append(imgbytedata[i].ToString("X"));
}