将一个字节数组 (BLOB IBM DB2) 中的多个图像导出到磁盘
Posted
技术标签:
【中文标题】将一个字节数组 (BLOB IBM DB2) 中的多个图像导出到磁盘【英文标题】:Export multiple images in one byte array (BLOB IBM DB2) to disk 【发布时间】:2021-10-19 04:17:53 【问题描述】:我在数据库(IBM DB2)中有一个“内容”列(BLOB 数据),并且记录的数据与(https://drive.google.com/file/d/12d1g5jtomJS-ingCn_n0GKMsM4RkdYzB/view?usp=sharing)相同 我已经被编辑打开了,我认为其中有不止一张图片(https://i.stack.imgur.com/2biLN.png,https://i.stack.imgur.com/ZwBOs.png)。
我可以将字节数组中的图像(使用 C#)导出到我的磁盘,但是对于多个图像,我不知道该怎么做。
请帮帮我!谢谢!
编辑 1: 我已尝试通过此代码将其导出为仅一张图片:
private void readBLOB(DB2Connection conn, DB2Transaction trans)
try
string SavePath = @"D:\\MyBLOB";
long CurrentIndex = 0;
//the number of bytes to store in the array
int BufferSize = 413454;
//The Number of bytes returned from GetBytes() method
long BytesReturned;
//A byte array to hold the buffer
byte[] Blob = new byte[BufferSize];
DB2Command cmd = conn.CreateCommand();
cmd.CommandText = "SELECT ATTR0102500126 " +
" FROM JCR.ICMUT01278001 " +
" WHERE COMPKEY = 'N21E26B04900FC6B1F00000'";
cmd.Transaction = trans;
DB2DataReader reader;
reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess);
if (reader.Read())
FileStream fs = new FileStream(SavePath + "\\" + "quang canh.jpg", FileMode.OpenOrCreate, FileAccess.Write);
BinaryWriter writer = new BinaryWriter(fs);
//reset the index to the beginning of the file
CurrentIndex = 0;
BytesReturned = reader.GetBytes(
0, //the BlobsTable column index
CurrentIndex, // the current index of the field from which to begin the read operation
Blob, // Array name to write the buffer to
0, // the start index of the array
BufferSize // the maximum length to copy into the buffer
);
while (BytesReturned == BufferSize)
writer.Write(Blob);
writer.Flush();
CurrentIndex += BufferSize;
BytesReturned = reader.GetBytes(0, CurrentIndex, Blob, 0, BufferSize);
writer.Write(Blob, 0, (int)BytesReturned);
writer.Flush(); writer.Close();
fs.Close();
reader.Close();
catch (Exception e)
Console.WriteLine(e.Message);
但无法查看图片,显示格式错误 => https://i.stack.imgur.com/PNS9Q.png
【问题讨论】:
“隔行扫描”是将图像的多个副本存储在一个文件中的过程,首先从低质量的副本开始。这样一来,只下载文件第一端的人就可以看到一些东西 - 并检查它是否是正确的文件:en.wikipedia.org/wiki/Interlacing_(bitmaps) |基本上所有现代文件格式都支持交错 - 也许这就是您在原始数据中看到的? 我不确定,因为我不知道它的细节,我只是在猜测 :( 如果是这样,有任何解决方案可以将这些图像导出到我的磁盘吗? 您是否尝试过仅导出一个并查看图像处理程序是否可以理解它?该原始数据是否存储了任何扩展名/文件格式?标题中的任何指示它们应该是什么格式? 你没有写任何代码。你也没有告诉结果是否是可读的图像。 我尝试将其导出为仅一张图像(如我上面编辑的内容)但无法查看图像 【参考方案1】:您目前假设该数据库中的所有 BLOBS 都是 JPEG 图像。但显然不是这样的。
选项 1:这是一个错误的数据
保存到数据库的程序可能会失败。
数据库本身可能会失败,尤其是在事务关闭的情况下。 BLOB 的事务很可能已关闭。
存储数据的物理磁盘可能已降级。再说一次,您不会通过 BLOBS 获得大量冗余和纠错(此外,使用纠错需要首先通过适当的 DBMS)。
选项 2:这不是 jpg
我知道一篇关于 Unicode 的文章说“[...]问题归结为一个天真的程序员,他不理解一个简单的事实,即如果你不告诉我一个特定的字符串是否使用 UTF- 8 或 ASCII 或 ISO 8859-1(拉丁语 1)或 Windows 1252(西欧),您根本无法正确显示它,甚至无法确定它的结束位置。”
这适用于图像的双重、三重和四重:
这可以是使用Interlacing 的任意数量的格式。 这可能是一个专业的图形程序图像/项目文件,如TIFF。它可以完全包含多个图像 - 您正在使用的每一层最多一个。 这甚至可以是通过 .ZIP 压缩和 word 文档运行的 .SVG file(包含绘图命令的 XML 文本) 这甚至可以是 PDF,其中图像通常附加在后面(允许您阅读带有部分文件的文本,类似于交错)【讨论】:
我确定数据没有错误,因为我可以通过我的 IBM Websphere Portal 来查看这些图像(并且 unicode 是 UTF-8)。但我的目的是将这个门户(IBM DB2)的数据转换为另一个数据库(SQL Server),所以我需要从旧数据库中导出所有信息。我可以在门户网站上导出 NEWS 的标题、内容、缩略图...,但这些图像,我不能:( @Kid1412 不。 UTF-8 只是编码 unicode 的众多方法之一。您需要阅读我链接的文章,因为您有很多误解。 |如果该数据库通常通过 Web 门户访问,它甚至可能使用专有格式。与您在 Wikipedia 上找到的任何内容完全无关的内容。除非您绝对确定文件类型,否则您无法可靠地传输此数据。 非常感谢!我试过了,这是 .ZIP 文件,不是图片 :( 再次感谢!以上是关于将一个字节数组 (BLOB IBM DB2) 中的多个图像导出到磁盘的主要内容,如果未能解决你的问题,请参考以下文章