各位,我有个需求,将N个小图片拼接成一个超大图片(GB级的),一时想不到什么好的解决方法,请大家帮帮忙!

解决方案 »

  1.   

    关注一下,拼成大图片 ??难道放到一个区域,利用picturebox??中间做到无缝连接?
      

  2.   

    不用Picturebox显示的,在特殊场合有用,无缝连接倒是真的。但是那么多小图,然后拼接成一个超大的图片,肯定是不能在内存里面操作的。
      

  3.   

    定义一个序列,可以按照图片名称 如1.gif、2.gif...等
    然后按照某种排列算法拼凑起来
      

  4.   

      图片合并
     private Bitmap MergerImg(Dictionary<string, Bitmap> bitMapDic)
            {
                Bitmap backgroudImg = new Bitmap(bitMapDic.Count * 12, 16);
              Graphics g = Graphics.FromImage(backgroudImg);
                g.Clear(System.Drawing.Color.White);
                int j = 0;
                foreach (KeyValuePair<string, Bitmap> entry in bitMapDic)
                {
                    Bitmap map = entry.Value;
                    g.DrawImage(map, j * 11, 0, map.Width, map.Height);
                    j++;
                }
                g.Dispose();
                return backgroudImg;
            }
      

  5.   

    是这样的,我们把google map的地图瓦片全部下载下来了,准备拼成一张大图,然后按我们自己的投影系统和切图算法再切成小图。。
      

  6.   

    4~5M的图片加载到内存就有500M以上(跟图像质量有关),何况3~4G的图片,想一次性显示基本不可能。除非是图片可以放大、缩小或可以拖动。实际上google map 也不会直接把很大的图片都加载到web上。我的建议:
        图片以碎片(小图片)的形式保存,并事先计算好小图在大图中的坐标,在“大图”显示时先计算出显示区域的图像对应的图片碎片,然后调取碎片显示到指定的位置,并对超出显示区域的图像进行裁剪
        对于该功能的实现可分三层,1、管理碎片的存储、调阅;2、通过图片显示坐标计算碎片、调阅碎片、生成要显示的图片;3、UI显示,用Picturebox加些事件,并与第2层通讯就可以了
      

  7.   


    嗯,你说的很有道理。但是,可能是我解释得不到位吧。
    第一,google map 本身显示都是256*256大小的瓦片,我如果只是为了显示就没必要再拼接。
    第二,因为我参与的这个GIS应用使用的投影坐标系和google map的不一样,google map上的瓦片到我的这个系统上,肯定会扭曲或者位置偏移。
    第三,我们公司能力有限,没有自己的卫片来源,所以选择从google map上下载卫片,拼接成一张大图后,再按照我们的这个投影坐标系对图片进行切割。然后就是你在上面说的方法了。不过还是感谢你,据说用GDAL可以,我去试试
      

  8.   


    拼成一张大图,不是真正的需求,是你们自己加进去的。而你们遇到的问题恰好出现在自己加的需求中。那么变通一下。去掉拼成一张大图这个步骤,直接在google map的地图瓦片提取你们需要的小图。
      

  9.   

    。。,google map 小图我们已经有了,投影坐标不一样,没用,就比如google map 的中国地图是偏长,我们的优点类似压扁了。原有瓦片都没用的。
      

  10.   


    需要gis不 联系 32768021
      

  11.   

    Gdal如何计算有效数据的长和宽呢?