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

我需要创建一个文件,将图像作为文本嵌入到某些记录中。 我把图像写成文本时遇到了一些麻烦。 我正在做的是从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文本时,完全相同的字节数组未正确写入。

谢谢。

编辑通过使用BinaryWriter(byte [])将图像正确写入文本已更正此问题。 感谢大家的帮助!

一方面,ASCII只有七位。 但是,我不相信您的代码实际上使用ASCII。 它有点使用ISO-8859-1。

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

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

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

另请注意,如果您的代码确实有效,那么它仍然会非常低效 – 请阅读StringBuilders ,然后考虑您的代码是半等效的

 Encoding.GetEncoding(28591).GetString(data); 

但是,base64绝对是无损地在文本和二进制数据之间进行转换的方法。 当然,您需要将其转换回二进制才能再次查看TIFF。

请注意,您尚未显示如何保存或加载数据 – 您也可能遇到问题。 事实上,我怀疑如果你能够准确地保存字符串,你可能很幸运并保留了数据,具体取决于你正在用它做什么……但是无论如何都要使用base64。

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

在文本文件中存储二进制数据总是一个坏主意,因为编码可能会将字节转换为另一种表示forms,并且特殊字符(如换行符)也可能会被特殊处理并转换。

将数据作为字节数组存储在二进制文件中,或者使用适当的二进制文件进行ascii转换,如Jon的Base64提议,或者也可以使用逗号分隔的hex值列表。

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

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

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

您可能正在以Unicode格式读取数据库,这将改变图像中的某些二进制值。

您可以使用System.IO.File类上的方法来读取/另存为二进制文本和文本。 这些可能有助于上面提到的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; }