C# 将.tiff读取到内存中的字节数组,然后转换到映像
我收到了一个项目,涉及从Access数据库表中读取记录,并将这些信息放入一本大的PDF小册子中 Access表中的一列是包含.tiff图像信息的备注列。我之所以这样做,是因为写入文本文件时,文件信息以“II*”开头,我读到的是一个.tiff头,表明文件是按英特尔字节顺序排列的 所以,说到这里,我需要将这个MEMO字段转换成一个图像,并将该图像写入PDF,如果可能的话,我想在内存中完成 到目前为止,我实际转换的代码如下:C# 将.tiff读取到内存中的字节数组,然后转换到映像,c#,image,memorystream,C#,Image,Memorystream,我收到了一个项目,涉及从Access数据库表中读取记录,并将这些信息放入一本大的PDF小册子中 Access表中的一列是包含.tiff图像信息的备注列。我之所以这样做,是因为写入文本文件时,文件信息以“II*”开头,我读到的是一个.tiff头,表明文件是按英特尔字节顺序排列的 所以,说到这里,我需要将这个MEMO字段转换成一个图像,并将该图像写入PDF,如果可能的话,我想在内存中完成 到目前为止,我实际转换的代码如下: using System; using System.Drawing; us
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Collections.Generic;
using System.Text;
namespace ElectionsPollBooks
{
class ImageConversion
{
public Image ConvertMemo(string s_convert)
{
byte[] ba_incTiff = Encoding.Unicode.GetBytes(s_convert);//string of information from the Memo field in the Access Database
using (MemoryStream ms_incTiffImage = new MemoryStream(ba_incTiff))//takes our just converted byte array and reads it to memory as the input tiff
{
return Image.FromStream(ms_incTiffImage);//take said tiff stream that we just made, and return it as an image.
}
}
}
}
现在我在返回图像.FromStream(ms\u incTiffImage)上得到参数无效“
错误
method,我理解这意味着字节数组不是Image.FromStream()
方法所理解的任何形式的数据
这让我想知道我的问题是否是在这一行中使用Unicode编码读取字符串:byte[]ba_incTiff=encoding.Unicode.GetBytes(s_convert)代码>
但这对我来说是全新的领域,我不确定我的思维过程是否正确
任何帮助都将不胜感激
谢谢大家抽出时间
更新:
当我使用file.writealText(@“revonelvant\Path\Foo\test.txt”,s_convert)将备注字段输出到文本文件时代码>
最后,我将其作为输出的一个片段:
二、P8$BaP¸d6ˆDbQ8¸V-FcQ¸V=HdR9$–M'“JeRüd”/)LfS9Öm7äNgSä
一些补充资料:
ba_incTiff
以14176字节的计数结束,前5个字节是73,0,73,0,42(我不确定这是否相关,但我现在正在抓救命稻草)
更新
我能够发现在备忘录文件中存储的信息上是否有任何特殊的编码,以发现没有
通过将byte[]ba_incTiff=Encoding.Unicode.GetBytes(s_convert)
更改为byte[]ba_incTiff=Encoding.Default.GetBytes(s_convert)代码>,我能够克服这个问题
但是,现在我收到一个在GDI+中发生的一般错误。
错误…因此图像在Access中存储为字符串?我认为您需要确定该字符串是如何生成的Encoding.X.GetBytes(s)
将获取表示字符串的字节,而不是原始字节数组的字符串表示形式的实际转换。通常,存储为字符串的字节数组是base64或hex-数据是这两种格式之一吗?如果您可以提供其中一个图像的文本示例,可能很清楚它是什么类型的…@MikeT你不能通过文本编辑器复制/粘贴二进制数据。我敢打赌这些数据是垃圾数据——首先是错误插入的。有人确认过有人成功读取过该表中的图像吗?如果有的话,是否有人拥有应用程序的源代码?看起来有人获取了一个图像的字节数组,对该图像进行了编码.UTF8.GetString
(或类似),然后将该字符串转储到数据库中。如果发生这种情况,则无法检索数据,因为字符串不能准确反映字节。将字节数组存储为字符串的正确方法是只使用可打印字符(特别是可打印ASCII字符),可以在没有歧义的情况下来回转换。这就是Base64、十六进制、ASCII-85、basE91等的用途。Base64可能是最常见的,因为它是一致的(3个字节=4个字符,不包括填充),并且易于读取。十六进制易于读取,但更大,而ASCI85和basE91较小,但不太常见,不太一致,更难读取。因此图像在Access中存储为字符串?我认为您需要确定该字符串是如何生成的Encoding.X.GetBytes(s)
将获取表示字符串的字节,而不是原始字节数组的字符串表示形式的实际转换。通常,存储为字符串的字节数组是base64或hex-数据是这两种格式之一吗?如果您可以提供其中一个图像的文本示例,可能很清楚它是什么类型的…@MikeT你不能通过文本编辑器复制/粘贴二进制数据。我敢打赌这些数据是垃圾数据——首先是错误插入的。有人确认过有人成功读取过该表中的图像吗?如果有的话,是否有人拥有应用程序的源代码?看起来有人获取了一个图像的字节数组,对该图像进行了编码.UTF8.GetString
(或类似),然后将该字符串转储到数据库中。如果发生这种情况,则无法检索数据,因为字符串不能准确反映字节。将字节数组存储为字符串的正确方法是只使用可打印字符(特别是可打印ASCII字符),可以在没有歧义的情况下来回转换。这就是Base64、十六进制、ASCII-85、basE91等的用途。Base64可能是最常见的,因为它是一致的(3个字节=4个字符,不包括填充),并且易于读取。十六进制易于阅读,但更大,ASCI85和basE91更小,但不太常见,不太一致,更难阅读。