问:
捕捉到 System.ArgumentExceptionMessage=参数无效。Source=System.DrawingStackTrace:在 System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format)在 System.Drawing.Bitmap..ctor(Int32 width, Int32 height)
由于项目需要导出完整图片,我使用Bitmap(int width, int height)创建Bitmap并保存,但是在实际中有些时候width和height比较大,超过了10000,在new的时候就报参数无效的错误,但是由于项目要求,又不能对图片进行切割,请问还有没有别的方法可以让我导出这种超大尺寸的图片吗?
这是我的问题截图:(VS2019)
答:
http://bbs.csdn.net/topics/310014905 创建超大图。
http://bbs.csdn.net/topics/90300658 转成流处理。
以上两种方法你都可以试试,个人觉得转成流会更好一点,不用考虑大小了。
你好,我现在要做的是new 一个1w*1w的Bitmap,还没做到保存读取的地步呢,你给的两个链接我也都看过了,没发现有创建超大图片的方法。
第一个链接讲的就是生成超大的图片的方法,你细看一下,另外第二个链接也是讲用流生成大图片。
你好,第一个链接是验证他们的电脑最大能创建多大的图片,但是明显的不符合我的要求,也许的电脑运行的程序太多了,我这儿能创建的最大的图片都不超过1W。这两个链接我前后算上今天看了3天了。
呃 不好意思~我误解你了, 文中也有提到,与电脑的内存有关系,建议你可以测试一下,找一台大内存的机器试试。
没事,我这机器上开了俩VS2012,还有浏览器,QQ等各种软件,我估计得另辟途径,要是能直接在硬盘上创建个Bitmap,就好了,这样就不会有这种大小的限制了。
在硬盘生成是不可以的,因为生成Bitmap的代码是在内存中处理的,只有生成完后才能保存了硬盘,所以还是换机器测试吧。
请问你的Bitmap是android中的吗?
不是,就是普通的Winform,C#.Net运行在桌面上的应用程序。
试了一下, 创建Drawing.Bitmap的函数时会分配其相应的内存,分配的内存数则是很简单的 长*宽*4 了。
当申请20000*20000大小的图片的时候,需要1.57g内存,而默认的winform程序是32位的,分配不到1.5g内存的,申请内存失败后就报这个参数异常了。此时把程序改成64位的就没有问题了。
只要没有超过内存限制,简单的改用64位程序就可以处理很大的图片了。
对于超大图片,则需要根据bmp文件的格式自己写算法划片处理,直接生成文件了。
最后解决这个创建超大图片的问题了。
首先将图片分割成m * n个小图片,分别使用GDI+绘制出来,然后使用GDAL组件把这些图片合并起来,就OK了。