我需要创建一个文件,将图像作为文本嵌入到某些记录中。我在将图像写入文本时遇到一些问题。我正在做的是将图像作为字节数组从 SQL 数据库(图像类型)收集,然后通过遍历每个字节并将该字节的 ASCII 等效项写入该文件,将该图像写入文本文件。
在将该图像写入文本文件之前,我必须将其转换为 CCITT4 格式的 TIFF(以前是 jpeg)。为了仔细检查是否正确完成,我还将流保存为 TIFF 并在“AsTiffTagViewer”中查看它,这表明压缩是正确的。我能够在适当的查看器中查看冲突;但是,当从文件中收集文本时,我无法查看图像。
这是代码:
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 文本时未正确写入。
谢谢。
EDIT通过使用 BinaryWriter(byte[]) 将图像正确写入文本,此问题已得到纠正。感谢大家的帮助!
一方面,ASCII 只有七位。但是,我不相信您的代码实际上使用了 ASCII。它隐含地使用了 ISO-8859-1。
Never将文本视为二进制,反之亦然。它会always导致问题。
将二进制转换为 ASCII 文本的最佳方法是使用 Base64:
string text = Convert.ToBase64String(frontImage);
byte[] data = Convert.FromBaseString(text);
另请注意,如果您的代码did工作,但效率仍然很低 - 继续阅读字符串生成器 http://pobox.com/~skeet/csharp/stringbuilder.html然后考虑你的代码半等价于
Encoding.GetEncoding(28591).GetString(data);
然而,base64 绝对是文本和二进制数据之间无损转换的最佳方式。当然,您需要将其转换回二进制格式才能再次查看 TIFF。
请注意,您尚未显示如何保存或加载数据 - 您也可能会遇到问题。事实上,我怀疑如果你能够准确地保存字符串,你might很幸运并保留了数据,具体取决于您正在用它做什么......但无论如何都要使用base64。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)