写入300 dpi图像时出现内存异常

时间:2011-01-19 06:13:02

标签: c# .net asp.net

我要求使用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();
}

请建议是否还有其他更好的选择!!

1 个答案:

答案 0 :(得分:1)

我看到这里有两个基本选项。

  1. 获得更广泛的架构。您可能需要在具有足够交换空间的x64计算机上执行此操作。这些尺寸的24位像素图将占用300×300×12×12×11×15×3 = 6,415,200,000字节的内存,这在x64机器上是合理的,但是大于虚拟内存空间x86能够寻址。

  2. 绑扎或平铺。创建一系列较小的像素图,一次一个,每个像素图对应于图像的某个子部分并渲染该部分。 (绑定意味着从图像的一侧到另一侧的条纹,同时沿着两个维度平铺印章。)我不完全确定如何使用System.Drawing.**工具箱中的工具将这些部分拼接在一起但是。