Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用图形时,图片内存不足,C#_C#_Graphics_Picturebox - Fatal编程技术网

使用图形时,图片内存不足,C#

使用图形时,图片内存不足,C#,c#,graphics,picturebox,C#,Graphics,Picturebox,代码很简单:我按下按钮,图片被加载到PictureBox中 private void button1_Click(object sender, EventArgs e) { using (FileStream stream = File.OpenRead(FullName)) { pictureBox1.Image = (Bitmap)Bitmap.FromStream(stream).Clone(); st

代码很简单:我按下按钮,图片被加载到PictureBox中

    private void button1_Click(object sender, EventArgs e)
{
        using (FileStream stream = File.OpenRead(FullName))
        {
            pictureBox1.Image = (Bitmap)Bitmap.FromStream(stream).Clone();
            stream.Close();
            stream.Dispose();
        }
}
但是当我从其他函数\事件在PictureBox'e上使用图形时,它断言Graphics.FromImage上没有足够的内存。不管我怎么安排这个日程。例如:

    using (Graphics g = Graphics.FromImage(pictureBox1.Image))
{
    g.Clear(Color.FromArgb(0, 255, 255, 255));
    pictureBox1.Invalidate();
}

问题是,为什么在将图片上传到PictureBox之前,我可以对图形执行任何操作:剪切、填充、绘制;但是上传完一张照片我就不能了?p、 美国图片尝试了不同的尺寸。相同的图片在上传之前可以工作(它已经在默认的pictureBox中),但在上传到pictureBox后不工作。就这个问题浏览了很多论坛,但没有找到我的案例(或最类似的案例)。

您有3种选择:

1) 分配
Image.FromStream()
结果,而不克隆它:PictureBox控件更喜欢自己对底层流执行操作(请参见方法)

2) 在using块内执行所有操作。此时流仍将有效:

using (FileStream stream = File.OpenRead(FullName)
{
    pictureBox1.Image = (Image)Image.FromStream(stream).Clone();
    using (Graphics g = Graphics.FromImage(pictureBox1.Image))
    {
        g.Clear(Color.FromArgb(0, 255, 255, 255));
    }
}
3) 直接使用该方法。

    pictureBox1.Load(FullName);
所有方法最终都将使用PictureBox控件内部(.Net source)方法。查看如何处理图像


调用
Graphics.FromImage()
将不再引发异常。

因此问题正在处理中,由Graphics.FromImage使用。表示从Graphics.FromImage打开的流必须在处理图像的整个过程中保持打开状态。好的,我们可以使用MemoryStream:

    MemoryStream ms;

private void button1_Click(object sender, EventArgs e)
{

    ms = new MemoryStream();
    using (FileStream stream = File.OpenRead(FullName))
    {
        stream.CopyTo(ms);
        pictureBox1.Image = Bitmap.FromStream(ms);
    }
}        


private void button2_Click(object sender, EventArgs e)
{
    using (Graphics g = Graphics.FromImage(pictureBox1.Image))
    {
        g.Clear(Color.FromArgb(0, 255, 255, 255));
    }     
}

和image.Clone()需要删除,因为流必须具有对同一图像的引用,而不是对其副本的引用才能正确工作。(老实说,简单的程序可以在没有MemoryStream的情况下工作)

在第一个示例中,如果您对FileStream使用()块,则不需要调用Close()、Dispose()。正如我在第一个示例中看到的,您正在调用Clone(),因此您有另一个对象,但第二个对象将处理该对象。看看这些:我认为解决方案是这样的:在图形中,“内存不足”异常主要发生在image.propertyitems抛出一些异常时。那时,我们需要将图像存储在流中,然后再次从流中获取图像。哦,上面的答案(我没有立即注意到)看起来更详细。这个答案已经没有多大意义了。谢谢,第一个方法帮助我=)
    MemoryStream ms;

private void button1_Click(object sender, EventArgs e)
{

    ms = new MemoryStream();
    using (FileStream stream = File.OpenRead(FullName))
    {
        stream.CopyTo(ms);
        pictureBox1.Image = Bitmap.FromStream(ms);
    }
}        


private void button2_Click(object sender, EventArgs e)
{
    using (Graphics g = Graphics.FromImage(pictureBox1.Image))
    {
        g.Clear(Color.FromArgb(0, 255, 255, 255));
    }     
}