我将各种格式的图像(.png、.jpg、.bmp 等)作为压缩文本存储在 SQL Server 2005 表的文本列中。我需要读取该行,解压缩图像并将其存储在另一个表的图像列中。
我正在使用 SharpZip 库,所有示例都处理文件源和目标。我找不到任何涵盖从一个变量解压缩到另一个变量的内容。非常感谢说明此内容的代码片段或指向相关资源的链接。
编辑:更多信息 - 数据存储在 TEXT 列中。如下所示(为显示而缩写的文本栏):
ImageID ImageData
1 FORMAT-ZIPV3 UEsDBBQAAAAIAOV6wzxdTnDvshs...
2 FORMAT-ZIPV3 UEsDBBQAAAAIAAF2yjxGncjOLgA...
3 FORMAT-ZIPV3 UEsDBBQAAAAIAKd6yjyjnQNr6gg...
4 FORMAT-ZIPV3 UEsDBBQAAAAIALdNyzyrPC8EMJw...
5 FORMAT-ZIPV3 UEsDBBQAAAAIAA1rOD1nZY1t0f0...
6 FORMAT-ZIPV3 UEsDBBQAAAAIANZplj2seyJ+VmM...
7 FORMAT-ZIPV3 UEsDBBQAAAAIAC5vhD27LPbPcv8...
8 FORMAT-ZIPV3 UEsDBBQAAAAIAK1qKz5DJNH3xMg...
9 FORMAT-ZIPV3 UEsDBBQAAAAIAHVkEztC3th/9hs...
10 FORMAT-ZIPV3 UEsDBBQAAAAIAEtXKz7DXHUdvow...
我可以肯定的是,图像在插入表格之前使用 SharpZip 在过程中的某个时间点进行了压缩。似乎格式信息在插入之前已添加到数据的开头。
看看这些数据,有没有人知道这些图像数据是如何被操纵的?同样,我需要将未压缩的图像数据放入有利于阅读的数据类型列中,以便在网页上显示。
编辑:好的,我很难过。执行以下代码会产生错误“无法将参数值从 Int32 转换为 Byte[]”。它似乎将字节数组的长度放入字节数组的值中......
commandUncompressed.Connection = connectionUncompressed;
commandUncompressed.Parameters.Add("@Image_k", SqlDbType.VarChar, 10);
commandUncompressed.Parameters.Add("@ImageContents", SqlDbType.Image);
commandUncompressed.CommandText = sqlSaveImage;
connectionUncompressed.Open();
reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine(reader["Image_k"].ToString()); // Merely for testing
String format = reader["ImageContents_Compressed"].ToString().Substring(0, 12);
var offset = 13; //"FORMAT-ZIPV3 ".Length;
var s = reader["ImageContents_Compressed"].ToString().Substring(offset);
var bytes = Convert.FromBase64String(s);
if (format == "FORMAT-ZIPV2 ")
{
bytes = ConvertStringToBytes(s); // Not a Base-64 encoded string? External conversion function utilized.
}
using (var zis = new ZipInputStream(new MemoryStream(bytes)))
{
ZipEntry zipEntry = zis.GetNextEntry(); // Doesn't seem to work unless an entry has been referenced
byte[] buffer = new byte[zis.Length];
commandUncompressed.Parameters["@Image_k"].Value = reader["Image_k"].ToString();
commandUncompressed.Parameters["@ImageContents"].Value = zis.Read(buffer, 0, buffer.Length);
commandUncompressed.ExecuteNonQuery();
}
}
}
它似乎可以很好地从源文本列中读取数据。我只是无法弄清楚如何将其放入图像类型参数中。缓冲区变量的值显示字节数组的长度,而不是实际字节。也许这就是 value 属性通常显示的字节数组?我如此接近,却又如此遥远。:/
编辑:好的,我是个傻瓜。我做了以下更正,它有效!
zis.Read(buffer, 0, buffer.Length)
commandUncompressed.Parameters["@ImageContents"].Value = buffer;
此时我只能处理 FORMAT-ZIPV3 数据,因为我还没有弄清楚如何解码 FORMAT-ZIP2 字符串。以下是 V2 数据的样本。如果有人能够确定编码,请告诉我。如果使用 BZIP 而不是 ZIP 格式进行压缩,会有所不同吗?
ImageID ImageData
1 FORMAT-ZIPV2 504B03041400020008005157422A2E25FDBAF26701008D6901000E...
2 FORMAT-ZIPV2 504B03041400020008009159422A7FC94BA2B2540500D35705000E...
3 FORMAT-ZIPV2 504B0304140002000800685A422A0CAA51F4473A0600B97206000E...
4 FORMAT-ZIPV2 504B03041400020008001D5D422A770BD3ED201902002C4A02000E...
5 FORMAT-ZIPV2 504B0304140002000800325E422A4B6C2FB4045001001C6E01000E...
6 FORMAT-ZIPV2 504B03041400020008006F72422A5F793AC1A1F00200ECF302000E...
7 FORMAT-ZIPV2 504B0304140002000800D572422A1B348A731DE5000085EB00000E...
8 FORMAT-ZIPV2 504B03041400020008003D73422A8AEBB7F855640300DD1B04000E...
9 FORMAT-ZIPV2 504B03041400020008006368D528C5D0A6BA794900004A2502000E...
10 FORMAT-ZIPV2 504B03041400020008008E5B6C2A2D9E9C33D7AF05005CEC05000E...