大型JPEG/PNG图像序列循环播放

5
我一直在处理有关远程感应图像处理和图像序列循环的项目。每个结果图像(以JPEG或PNG格式)大约有8000 * 4000个像素。我们的用户通常希望根据感兴趣的区域循环图像序列(超过50张)。因此,我必须根据用户的可视化客户端大小从每个图像中提取所需的查看区域。例如,如果用户当前的客户端视图为640 * 480,则我将根据当前的x(列)和y(行)坐标从每个原始图像中找到一个640 * 480数据块,并重新映射到客户端视图。当用户通过鼠标拖动到另一个查看区域时,我们的程序必须尽快重新加载每个原始图像中的区域数据。
我知道既没有JPEG库也没有PNG库具有内置的数据块读取例程,例如 long ReadRectangle(long x0,long y0,long x1,long y1,char * RectData); long ReadInaRectangle(long x0,long y0,short width,short height,char * RectData);
内置的JPEG解压缩器缺乏这种功能。我知道JPEG2000格式有规定可以解压缩图像的特定区域。我对JEPG不是完全确定。
有人建议我使用CreateFileMapping,MapViewOfFile和CreateDIBSection来提交要映射到视图的文件映射的字节数。与*.raw,*.img和*.bmp等简单的平面二进制图像格式不同,JPEG的Blob不仅包含图像数据,还包括复杂的JPG头。因此,很难从JPEG文件中映射出一块数据块。
有人建议我使用图像平铺或图像金字塔技术生成子图像,就像许多流行的图像可视化(Google Earth等)和GIS应用程序(WebGIS等)所做的那样。
我该如何解决这个问题?
感谢您的帮助。
Golden Lee
2个回答

3
如果您可以接受区域坐标是8的倍数,ijg的JPEG库可能能帮助您加载部分JPEG图像。
您需要:
  1. 获取整个图像的所有DCT系数。这里有一个如何做到这一点的示例。是的,这将涉及到整个图像的熵解码,但这是JPEG解码中较便宜的步骤(IDCT是最昂贵的步骤,我们正在避免它)。
  2. 丢弃不需要的块(每个块由8x8个系数组成)。你将不得不手动完成这个过程,但由于布局非常简单(块按扫描线顺序排列),所以应该不难。
  3. 对每个帧应用块反DCT。你可能可以让IJG为您完成此操作。如果不能,则必须自己进行IDCT和颜色转换回[0, 255],因为JPEG的亮度在[-127, 128]之间。
  4. 如果一切顺利,您将获得已解码的JPEG图像。由于色度子采样,亮度和色度通道可能具有不同的尺寸,因此您将不得不通过缩放自行进行补偿。

前两步基本上已经通过链接涵盖了。第四步非常琐碎(您可以使用IJG接口获取色度抽样类型,并且缩放 - 基本上是上采样 - 可以使用类似OpenCV的东西或编写自己的代码轻松实现)。第步是我尚未尝试过的,但听起来应该是可能的。


1
+1:但您可能需要添加不同颜色分量的重新缩放和颜色转换。 - user180326
谢谢指出。我更新了答案。顺便说一下,IJG在其IDCT步骤中执行颜色转换,因此如果您正在使用不同的库进行IDCT,则只需自己执行颜色转换。 - mpenkov

0

使用gd库非常容易。LibGD是一个开源代码库,供程序员动态创建图像。


尽管此链接可能回答了问题,但最好在此处包含答案的必要部分并提供参考链接。仅限链接的答案可能会因链接页面更改而失效。 - Stewbob
@Stewbob:答案不在链接后面。答案是“使用gd库很容易”,其中包括一个指向gd库的链接。在我看来,这很好。 - Stefan Steinegger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接