我试图从Hamamatsu NanoZoomer幻灯片扫描仪生成的文件中提取图像内容。 NDPI文件使用修改后的TIFF结构,并将图像内容以JPEG格式存储在一个大块中。使用StripOffset和StripByteCounts,我可以提取应该是JPEG文件的数据。如何正确打开/解码具有超过65500 * 65500像素的jpeg图像?
数据流具有JPEG文件的所有正确签名,例如FFD8,扫描标记的开始和FFD9,扫描标记的结束。如果这是一个小于65500 * 65500像素的图像,那么如果将数据流保存为jpeg文件,则可以打开文件。
在JFIF标题中,FFC0标记之后的第三个和第四个字节表示图像高度;之后的两个字节表示图像宽度。但是,对于大于65500 * 65500像素(实际上是122880 * 78848像素)的图像,这些假定表示图像高度和图像宽度的四个字节全部为零。我将它们改为255,220,255,220,跟在this(255-263行)。当我通过在Windows中右键单击来查看jpeg信息并选择细节时,我确实看到Windows Photo Viewer将分辨率读取为65500 * 65500,尽管它们并不代表实际的像素分辨率。问题是,当我试图打开图像时,它显然是以错误的方式解码的。
所以我的问题是:我该如何正确打开这样一个jpeg文件?或者说,我该如何正确解码这些图像内容的全部内容?
我现在试图理解使用MATLAB的文件结构。最终,我将使用Python + OpenCV(或者如果需要,使用Python + Cython + libjpeg-turbo)将整个图像读入内存。
因为我没有要测试的图像,所以很难说,但是如果你在处理大图像时一定要考虑使用'vips'。它擅长于... http://stackoverflow.com/a/36377369/2836621 –
我相信这是一个libjpeg或libjpeg涡轮问题。 VIPS正在使用其中之一。所以只要切换到VIPS就不会解决这个问题。 – user3667217
我已经编写了自己的图像库(包括自定义JPEG编解码器),并且此图像可能会被我的代码打开。极端的大小是一次打开它的一个问题。我可以打开缩放后的副本(1/8 x 1/8 = 14848/12800)或打开特定的矩形裁剪。完整的res颜色未压缩图像需要36GB的RAM。 – BitBank