none
如何快速绘制大量小图片然后合成一个大图片? RRS feed

  • 问题

  • 我有一个schematic文件,是《Minecraft》的一种纹理文件,里面有各种方块的ID数据。

    我打算读取里面的数据然后根据ID编号绘制到我的程序上面,但是我发现我的方法非常慢,别人生成一个256*256大小的图片几乎很快(1个图片16*16像素)

    而我这边完全绘制完需要6秒左右。以下是我的代码:

                SourceBlueMap = new Bitmap(BlocksRect.Width, BlocksRect.Height);
    
                Graphics Gpi = Graphics.FromImage(SourceBlueMap);
    
                AlphaBlock block;
    
                string strPath = @"C:\Users\Administrator\Desktop\Blocks";
    
                BlockInfo blockinfo;
    
                for (int x = 0; x < iXDim; x++)
                {
                    for (int y = 0; y < iYDim; y++)
                    {
                        for (int z = 0; z < iZDim; z++)
                        {
                            block = Blocks.GetBlock(x, y, z);
    
                            rect.X = x * BlockWidth;
                            rect.Y = z * BlockWidth;
    
                            if (BlockInfoList.Exists(info =>
                                (info.ID == block.ID && info.Data == block.Data)))
                            {
                                blockinfo = BlockInfoList.Find(info =>
                                (info.ID == block.ID && info.Data == block.Data));
    
                                if (File.Exists(strPath + "\\" + blockinfo.Name + ".png"))
                                {
                                    using (Bitmap bmp = new Bitmap(strPath + "\\" + blockinfo.Name + ".png"))
                                    {
                                        Gpi.DrawImage(bmp, rect);
                                    }
                                }
                            }  
                        }
                    }
                }
    
                Gpi.Dispose();

    这是别人的程序:http://www.diamondpants.com/spritecraft/PayPalDonate.aspx

    另外我还想支持自由缩放(不是放大不清楚的那张,类似于PS放大后的像素格子),以及记录每绘个绘制的小图片的坐标(鼠标放上面显示该图片名)

    2017年12月7日 7:46

答案

  • Hi,

    你可以把数据存储为 bitmap 形式,就可以了,然后直接draw bitmap 图片. 当你draw 完以后,记住删掉它,就不会出现内存不够的情况。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年12月11日 8:03
    版主

全部回复

  • Hi,

    欢迎在MSDN论坛发帖。

    我觉得你可以尝试把里面的数据都取出来,然后直接显示,这样的显示速度比较快,然后在取数据的时候,使用多线程同时去取,这样显示的速度又会提高一些。

    >>另外我还想支持自由缩放(不是放大不清楚的那张,类似于PS放大后的像素格子),以及记录每绘个绘制的小图片的坐标(鼠标放上面显示该图片名)

    据我所知,图片在显示的时候,你可以尝试选择一个 Zoom的模式,这样图片的大小,就可以自由缩放。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年12月8日 8:21
    版主
  • 首先感谢你的回复

    >>我觉得你可以尝试把里面的数据都取出来,然后直接显示,这样的显示速度比较快,然后在取数据的时候,使用多线程同时去取a,这样显示的速度又会提高一些。

    多线程去读的时候,如何把这些数据合理存放呢?而且数量多的话,内存会出现不够用的情况。

    最主要的是最后如何把小图片合并成大图片。


    2017年12月8日 8:55
  • Hi,

    你可以把数据存储为 bitmap 形式,就可以了,然后直接draw bitmap 图片. 当你draw 完以后,记住删掉它,就不会出现内存不够的情况。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年12月11日 8:03
    版主