C# 将图像作为二进制数据C写入文本文件#

C# 将图像作为二进制数据C写入文本文件#,c#,image,stream,C#,Image,Stream,我需要创建一个文件,将图像作为文本嵌入到一些记录中。我把图像写成文本有点困难。我所做的是从SQL数据库(图像类型)收集图像作为字节数组,然后通过遍历每个字节并将该字节的ASCII等价物写入文件,将该图像写入文本文件 在将该图像写入文本文件之前,我必须将其转换为CCITT4格式的TIFF(以前是jpeg)。为了再次检查是否正确执行了此操作,我还将流另存为TIFF并在“AsTiffTagViewer”中查看,这表明压缩是正确的。我能够在适当的查看器中查看tiff;但是,当从文件中收集文本时,我无法查

我需要创建一个文件,将图像作为文本嵌入到一些记录中。我把图像写成文本有点困难。我所做的是从SQL数据库(图像类型)收集图像作为字节数组,然后通过遍历每个字节并将该字节的ASCII等价物写入文件,将该图像写入文本文件

在将该图像写入文本文件之前,我必须将其转换为CCITT4格式的TIFF(以前是jpeg)。为了再次检查是否正确执行了此操作,我还将流另存为TIFF并在“AsTiffTagViewer”中查看,这表明压缩是正确的。我能够在适当的查看器中查看tiff;但是,当从文件中收集文本时,我无法查看图像

代码如下:

byte[] frontImage = (byte[])imageReader["front_image"];
MemoryStream frontMS = new MemoryStream(frontImage);
Image front = Image.FromStream(frontMS);
Bitmap frontBitmap = new Bitmap(front);
Bitmap bwFront = ConvertToBitonal(frontBitmap);
bwFront.SetResolution(200, 200);
MemoryStream newFrontMS = new MemoryStream();
bwFront.Save(newFrontMS, ici, ep);
bwFront.Save("c:\\Users\\aarong\\Desktop\\C#DepositFiles\\" + checkReader["image_id"].ToString() + "f.tiff", ici, ep);
frontImage = newFrontMS.ToArray();   
String frontBinary = toASCII(frontImage); 

private String toASCII(byte[] image)
{
    String returnValue = "";
    foreach (byte imageByte in image)
    {
        returnValue += Convert.ToChar(imageByte);
    }
    return returnValue;
}   
正在写入文件的是frontBinary。有人知道是什么错了吗?保存的tiff是正确的,但是当作为ASCII文本写入时,没有正确写入完全相同的字节数组

多谢各位


编辑已通过使用二进制编写器(字节[])将图像正确写入文本来更正此问题。谢谢大家的帮助

首先,ASCII只有7位。但是,我不相信您的代码实际上使用ASCII。它隐式地使用了ISO-8859-1

切勿将文本视为二进制,反之亦然。它总是会导致问题

将二进制转换为ASCII文本的最佳方法是使用Base64:

string text = Convert.ToBase64String(frontImage);
byte[] data = Convert.FromBaseString(text);

也注意到,如果你的代码工作,它仍然是痛苦的低效-读上去,然后考虑你的代码是半等同于

Encoding.GetEncoding(28591).GetString(data);
然而,base64无疑是在文本和二进制数据之间进行无损转换的方法。当然,为了再次查看TIFF,您需要将其转换回二进制文件


请注意,您还没有展示如何保存或加载数据-您可能也有问题。事实上,我怀疑如果你能够准确地保存字符串,你可能会幸运地保存了数据,这完全取决于你在用它做什么。。。但是无论如何还是要使用base64。

获取二进制数据并将其转换为文本数据的一种方法是使用StreamReader并提供所需的编码。像上面提到的Jon一样,使用ASCII是不明智的,但如果有人确实想将二进制数据流传输到其他文本编码,下面是一些代码

public static String GetString(System.IO.Stream inStream)
{
    string str = string.Empty;
    using (StreamReader reader = new StreamReader(inStream, System.Text.ASCIIEncoding.ASCII)) // or any other encoding.
    {
        str = reader.ReadToEnd();
    }
    return str;
}

您使用文本而不是二进制文件的具体原因是什么

将二进制数据存储在文本文件中总是一个坏主意,因为编码可能会将字节转换为另一种表示形式,而诸如换行符之类的特殊字符也可能会被特殊处理和转换


将数据存储为二进制文件中的字节数组,或者使用正确的二进制到ascii转换(如Jon的Base64建议),或者也可以使用逗号分隔的十六进制值列表。

如果仅将图像数据写入文件,则不应将其作为文本写入,而应作为二进制数据写入

如果在文件中混合文本和二进制数据,则不应将二进制数据转换为文本。它可能使用一些特定的编码来来回转换它,但它肯定不使用任何编码来将它转换为unicode字符(使用
convert.ToChar


反过来做。使用适当的
编码
对象的
GetBytes
方法将文本编码为二进制数据,这样您就只有二进制数据可以写入文件。

您可能正在将数据库读回Unicode,这将改变图像中的一些二进制值


您可以使用System.IO.File类上的方法读取/另存为二进制和文本。这些选项与上面提到的Base64选项一起可能会有所帮助。

不,这仍然是一个非常糟糕的主意-因为文本和二进制数据不能像那样很好地结合在一起,特别是使用Asciencoding,它将清除每个字节的顶部位。我只是给了这个家伙他想要的,即二进制数据转换为ascii,没有对目的或最终结果做出判断。然而,如果我知道数据会丢失(甚至没有说会发生),我认为给某人确切的要求不是一个好主意。显然,这与OP的更大目标背道而驰。想要保留无用或无用的帖子是可以理解的。我将清理这篇帖子,展示如何将任何二进制到文本编码进行流式传输,诚然,ascii在这种情况下是不好的。使用base64(或类似的-例如,可以使用base16)将二进制数据转换为文本是可以的。这听起来像是另一个工具可以加载的一种记录格式,这表明他不能真正定义整个文件格式,就像更改为用二进制编写所有内容所建议的那样。嗨,Jon,非常感谢你的解释。还感谢您提供关于StringBuilder的信息…我肯定会使用这些,而不是我不必要的低效连接。我很快会尝试你的建议,并会让你知道进展如何。嗨,乔恩。我尝试了Base64字符串,它确实有效。我能够将图像写入文件,并在读取文件时再次生成图像。谢谢你的帮助,我相信你的解释会帮助其他有类似问题的人。:)你好,乔恩。我将文件发送给的供应商刚刚通知我base64的格式不正确,应该是“英特尔格式”。我的联系人告诉我,文本应该以“II”开头,这与我使用旧方法时的开头相同。如果我回到旧方法,文本仍然不正确。我使用一个StreamWriter对象来实际写入文件,我做了一些研究,说也许BinaryWriter是一个不错的选择。也许这是一个潜在的问题?看看是否可以获得绝对精确的文件格式—不仅仅是名称,而是完整的sp