使用图形时,图片内存不足,C#
代码很简单:我按下按钮,图片被加载到PictureBox中使用图形时,图片内存不足,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
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));
}
}