我需要创建一个文件,将图像作为文本嵌入到某些记录中。我把图像写成文本时遇到了一些麻烦。我正在做的是从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 [])将图像正确写入文本已更正此问题。谢谢大家的帮助!
答案 0 :(得分:17)
一方面,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反正。
答案 1 :(得分:0)
获取二进制数据并将其转换为文本数据的一种方法是使用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;
}
答案 2 :(得分:0)
您使用文本而不是二进制文件的具体原因是什么?
将二进制数据存储在文本文件中总是一个坏主意,因为编码可能会将字节转换为另一种表示形式,并且特殊字符(如换行符)也可能会被特殊处理并转换。
将数据作为字节数组存储在二进制文件中,或者使用适当的二进制文件进行ascii转换,如Jon的Base64提议,或者也可以使用逗号分隔的十六进制值列表。
答案 3 :(得分:0)
如果您只将图像数据写入文件,则不应将其写为文本,而应将其写为二进制数据。
如果要在文件中混合文本和二进制数据,则不应将二进制数据转换为文本。它可能适用于某些特定的编码来来回转换它,但它肯定不适用于任何编码将其转换为unicode字符(使用Convert.ToChar
)。
反过来做。使用正确GetBytes
对象的Encoding
方法将文本编码为二进制数据,以便只有二进制数据写入文件。
答案 4 :(得分:0)
您可能正在以Unicode格式读取数据库,这将改变图像中的某些二进制值。
您可以使用System.IO.File类上的方法来读取/另存为二进制文本和文本。这些可能有助于上面提到的Base64选项。