1

好的,所以我现在正在制作一个 spritesheet 制作器,但我遇到了一些障碍。
我已经编写了代码,它成功地将所有图像拉入内存流并将它们放在一起,但是在保存程序时返回一个Generic GDI+ error.
我尝试打开另一个内存流以将新位图保存在下面,但事实证明我无法创建虚拟文件的内存流。
无论如何,这是到目前为止的代码:

class SpriteMaker
{
    static void Main()
    {
        bool cont = false;
        bool skip = false;
        while (cont == false)
        {
            Console.WriteLine("Enter a Folder name(end to end):");
            string fold = Console.ReadLine();
            if (fold.Equals("end"))
            {
                break;
            }
            try
            {
                string[] files = Directory.GetFiles(@"sprites\" + fold, "*.PNG");
                foreach (string file in files)
                {
                    Console.WriteLine(file);
                }
                skip = false;
            }
            catch (Exception)
            {
                Console.WriteLine("Folder not Found!");
                Console.WriteLine("Try Again!");
                cont = false;
                skip = true;
            }
            if (skip != true)
            {
                try
                {
                    string[] files = Directory.GetFiles(@"sprites\" + fold, "*.PNG");
                    System.Drawing.Bitmap stitchedImage = Combine(files);
                    Console.WriteLine("save filename (no extention)");
                    string fil = Console.ReadLine();
                    stitchedImage.Save(@"/sheets/"+fil+".png", System.Drawing.Imaging.ImageFormat.Png);
                    cont = true;
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error Creating Sprite Sheet");
                    Console.WriteLine(ex);
                    Console.WriteLine("Please Try Again!");
                }
            }
        }
        Console.WriteLine("Done!");
        Console.WriteLine("Program will now exit(Enter to continue)");
        Console.ReadLine();
    }
    public static System.Drawing.Bitmap Combine(string[] files)
    {
        //read all images into memory
        List<System.Drawing.Bitmap> images = new List<System.Drawing.Bitmap>();
        System.Drawing.Bitmap finalImage = null;

        try
        {
            int width = 0;
            int height = 0;

            foreach (string image in files)
            {
                //create a Bitmap from the file and add it to the list
                System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(image);

                //update the size of the final bitmap
                width += bitmap.Width;
                height = bitmap.Height > height ? bitmap.Height : height;

                images.Add(bitmap);
            }

            //create a bitmap to hold the combined image
            finalImage = new System.Drawing.Bitmap(width, height);

            //get a graphics object from the image so we can draw on it
            using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(finalImage))
            {
                //set background color
                g.Clear(System.Drawing.Color.Black);

                //go through each image and draw it on the final image
                int offset = 0;
                foreach (System.Drawing.Bitmap image in images)
                {
                    g.DrawImage(image,
                      new System.Drawing.Rectangle(offset, 0, image.Width, image.Height));
                    offset += image.Width;
                }
            }

            return finalImage;
        }
        catch (Exception ex)
        {
            if (finalImage != null)
            {
                finalImage.Dispose();
            }
            Console.WriteLine(ex);
            throw ex;
            Console.WriteLine("Press Enter to continue...");
            Console.ReadLine();
        }
        finally
        {
            //clean up memory
            foreach (System.Drawing.Bitmap image in images)
            {
                image.Dispose();
            }
        }
    }
}

任何帮助将不胜感激
编辑:我已经找到了这个错误的原因,它与创建stitchedImage有关......但是现在我得到一个内存异常......然后再次将350张奇怪的图像加载到MemoryStream中是致命的:/

4

1 回答 1

0

好吧,伙计们,我发现了问题……这是 GDI+ 的限制……因为图像的大小是 512*512,所以 GDI+ 限制达到了 127 张图像,这就是我在这里提出下一个问题的原因

于 2012-10-02T12:02:38.523 回答