我要求使用300DPI创建图像,但在图像合成期间,比如添加资源(字体,图像),我的内存异常。
using (Bitmap pg = new Bitmap(GetPixelsFromInches(float.Parse(pageWidth), dpi, actualDpi), GetPixelsFromInches(float.Parse(pageHeight), dpi, actualDpi)))
{
pg.SetResolution(float.Parse(dpi), float.Parse(dpi));
Graphics gr = Graphics.FromImage(pg);
gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
System.Drawing.Rectangle pgRect = new System.Drawing.Rectangle(0, 0, pg.Width, pg.Height);
SolidBrush solidWhite = new SolidBrush(Color.White);
gr.FillRectangle(solidWhite, pgRect);
currentPageDisplayed = xNode.Attributes["id"].Value;
foreach (XmlElement xElement in xNode)
{
//Here I am writing each elements, like texts or images.
DrawImageForElements(xElement, , dpi, actualDpi);
}
MemoryStream myMemoryStream = new MemoryStream();
//pg.Save(myMemoryStream, System.Drawing.Imaging.ImageFormat.Bmp);
String filename=@"c:\images\" + currentPageDisplayed + "+.png";
pg.Save(filename, System.Drawing.Imaging.ImageFormat.Png);
myMemoryStream.Dispose();
gr.Dispose();
pg.Dispose();
}
请建议是否还有其他更好的选择!!
答案 0 :(得分:1)
我看到这里有两个基本选项。
获得更广泛的架构。您可能需要在具有足够交换空间的x64计算机上执行此操作。这些尺寸的24位像素图将占用300×300×12×12×11×15×3 = 6,415,200,000字节的内存,这在x64机器上是合理的,但是大于虚拟内存空间x86能够寻址。
绑扎或平铺。创建一系列较小的像素图,一次一个,每个像素图对应于图像的某个子部分并渲染该部分。 (绑定意味着从图像的一侧到另一侧的条纹,同时沿着两个维度平铺印章。)我不完全确定如何使用System.Drawing.**
工具箱中的工具将这些部分拼接在一起但是。