大型JPEG / PNG图像序列循环

时间:2011-01-30 12:21:36

标签: c++ image loops

我一直在研究有关遥感图像处理和图像序列循环的项目。每个生成的图像(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文件中并不容易。

有人建议我使用图像平铺或图像金字塔技术来生成子图像,就像流行的,图像可视化(谷歌地球等)和GIS应用程序(WebGIS等)一样。

我该如何解决这个问题?

感谢您的帮助。

金利来

2 个答案:

答案 0 :(得分:3)

如果区域坐标是8的倍数,那么来自ijg的JPEG库可能可以帮助您加载部分JPEG图像。

你想要:

  1. 获取整个图像的所有DCT系数。这是一个example of how to do this。是的,这将涉及整个图像的熵解码,但这是JPEG解码的较便宜的步骤(IDCT是最昂贵的,我们正在避免它)。
  2. 丢弃不需要的块(每个块由8x8组成)系数。您必须手动执行此操作,但由于布局非常简单(块以扫描线顺序排列),因此不应该那么难。
  3. 将块逆DCT应用于每个帧。你可能会让IJG为你做这件事。如果你不能,那么你将不得不做自己的IDCT和颜色转换回[0,255],因为在JPEG的世界中强度是[-127,128]。
  4. 如果一切顺利,您将获得解码的JPEG图像。由于chroma subsampling,亮度和色度信道可以具有不同的尺寸,并且你将不得不通过缩放以补偿这种自己。
  5. 链接几乎涵盖了前两个步骤。第四个是很微不足道的(你可以使用IJG接口色度抽样和缩放的类型 - 本质上采样 - 很容易通过使用类似OpenCV或滚动自己的代码来实现)。 第三一个是我尚未尝试过的,但听起来有可能。

答案 1 :(得分:0)

使用gd library很容易。 LibGD是一个开源代码库,用于由程序员动态创建图像。