当前位置:编程学习 > C#/ASP.NET >>

【算法】把N个图片组合成N张大图

未知数量图片,图片长宽皆为32倍数,小于等于512*512
把这些图片组合成最大2048*2048的大图
放不下的另组合新的大图
组合的大图要尽可能利用空间

各位有什么好思路? --------------------编程问答-------------------- 合并图片代码,至于怎么组合,楼下提供。
  #region 合并图片
        /// <summary>
        /// 合并图片
        /// </summary>
        /// <param name="bitMapDic">bitmap数组</param>
        /// <returns>bitmap</returns>
        public Bitmap MergerImg(Bitmap[] bitMapDic)
        {
            int j = 0, twatch = 0, theight = 0;
            foreach (Bitmap entry in bitMapDic)
            {
                if (entry != null)
                {
                    j++;
                    theight = entry.Height;
                    twatch = entry.Width;
                }
            }

            Bitmap backgroudImg = new Bitmap(j * twatch, theight);
            Graphics g = Graphics.FromImage(backgroudImg);
            //清除画布,背景设置为白色
            g.Clear(System.Drawing.Color.White);

            j = 0;
            foreach (Bitmap entry in bitMapDic)
            {
                if (entry != null)
                {
                    g.DrawImage(entry, j * entry.Width, 0, entry.Width, entry.Height);
                    j++;
                }
            }
            g.Dispose();
            return backgroudImg;
        }
        #endregion
--------------------编程问答--------------------
引用 1 楼 guwei4037 的回复:
合并图片代码,至于怎么组合,楼下提供。
  #region 合并图片
        /// <summary>
        /// 合并图片
        /// </summary>
        /// <param name="bitMapDic">bitmap数组</param>
        /// <returns>bitmap</returns>
        public Bitmap MergerImg(Bitmap[] bitMapDic)
        {
            int j = 0, twatch = 0, theight = 0;
            foreach (Bitmap entry in bitMapDic)
            {
                if (entry != null)
                {
                    j++;
                    theight = entry.Height;
                    twatch = entry.Width;
                }
            }

            Bitmap backgroudImg = new Bitmap(j * twatch, theight);
            Graphics g = Graphics.FromImage(backgroudImg);
            //清除画布,背景设置为白色
            g.Clear(System.Drawing.Color.White);

            j = 0;
            foreach (Bitmap entry in bitMapDic)
            {
                if (entry != null)
                {
                    g.DrawImage(entry, j * entry.Width, 0, entry.Width, entry.Height);
                    j++;
                }
            }
            g.Dispose();
            return backgroudImg;
        }
        #endregion


合并当然简单啊,难在怎么最大限度利用空间…… --------------------编程问答-------------------- google 下料算法。 --------------------编程问答-------------------- 一般来说,这个看似简单的排列组合算法其实不简单,需要用到一些启发式的算法在经济的成本下寻找近似最优解。这些启发式的算法包括诸如模拟退火或者遗传算法。 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 组合拼接- -这个不仅仅是考虑加起来的最优解,还要考虑到是否能够拼接起来的问题,最好还是分开写,一个是求解最优解,一个是能否拼接的函数,如果符合,再把它们拼接起来,不符合咋再从求最优解的函数中获取除最优解以外的最优解,依次递推 --------------------编程问答--------------------
引用 6 楼 dota_sky_god 的回复:
组合拼接- -这个不仅仅是考虑加起来的最优解,还要考虑到是否能够拼接起来的问题,最好还是分开写,一个是求解最优解,一个是能否拼接的函数,如果符合,再把它们拼接起来,不符合咋再从求最优解的函数中获取除最优解以外的最优解,依次递推

拼接是肯定可以的,但是怎么求最优解?
有没有相关资料,我应该是百度的关键词不对,找不到资料……
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,