1

さて、私は現在スプライトシートメーカーを作っています、そして私は少し障害にぶつかりました。
私はコードを作成し、すべての画像をメモリストリームに正常にプルして一緒に配置しましたが、プログラムの保存に関しては。を返します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であるため、127枚の画像でGDI +の制限に達しているため、次の質問があります。

于 2012-10-02T12:02:38.523 に答える