我有一个28MB的动画gif作为嵌入式资源,我试图加载到我的'关于'形式。
表格代码如下:
private void About_Load(object sender, EventArgs e)
{
pictureBox1.Image = EmbeddedResources.image("mygif.gif");
}
public class EmbeddedResources
{
public static Assembly self { get { return Assembly.GetExecutingAssembly(); } }
public static Image image(string name)
{
Image result = null;
using (Stream res = self.GetManifestResourceStream("MyProject." + name))
{
result = Image.FromStream(res);
}
return result;
}
}
代码似乎没有找到资源的问题,因为result
中的EmbeddedResources.image()
填充了数据(非空),而pictureBox1.Image = EmbeddedResources.image("mygif.gif");
中的行About_Load()
填充了ShowDialog()
似乎没有错误地传递数据,但是在Form1
方法上加载表单后我得到以下异常。
这是我正在使用的代码(来自另一种形式.. About
)来加载和显示private void button1_Click(object sender, EventArgs e)
{
About frm = new About();
frm.ShowDialog(this);
}
表单。
at System.Drawing.Image.SelectActiveFrame(FrameDimension dimension, Int32 frameIndex)
at System.Drawing.ImageAnimator.ImageInfo.UpdateFrame()
at System.Drawing.ImageAnimator.UpdateFrames(Image image)
at System.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
为什么我会收到此异常,我需要做些什么才能修复它以便我的动画gif(约30秒循环)可以加载?(这是我可以获得的那么小)使用GIF动画制作的循环比使用过时的activex / com媒体控件或更旧的directx框架更简单,以支持视频作为背景,然后不得不在视频上添加控件 - 大混乱的噩梦)
{{1}}
答案 0 :(得分:1)
好的,我很尴尬,我没有早点抓住这个。问题是,通过将Stream
访问权限包含在using
块中,Stream
将在完成时处理。我之前已经看过这件事,并且总是想知道它的后果。现在我知道了后果。
一个简单的修复,不要Dispose
流。
public class EmbeddedResources
{
public static Assembly self { get { return Assembly.GetExecutingAssembly(); } }
public static Image image(string name)
{
Image result = null;
// note: typeof(EmbeddedResources).Namespace will only work if EmbeddedResources is defined in the default namespace
Stream res = self.GetManifestResourceStream(typeof(EmbeddedResources).Namespace + "." + name);
result = Image.FromStream(res);
return result;
}
}