Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将图像插入.NET中的富格文本文件_C#_.net_Image_Rtf - Fatal编程技术网

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
可能应该提及哪里出了问题,即您是否收到了一些异常或错误消息?您是否看到了我答案的更新?可能应该提及哪里出了问题,即您是否收到了一些异常或错误消息?您是否看到了我答案的更新?