首页 新闻 会员 周边

Image的SaveAdd报GDI+一般性错误

0
悬赏园豆:30 [已关闭问题] 关闭于 2014-09-12 17:25

如题,做一个gif图片缩小并保留动画的东东,每次运行到Image的SaveAdd就报GDI+发生一般性错误。代码是参照的别人的:http://blog.csdn.net/ojlovecd/article/details/8296371

  1. public Form1()  
  2. {  
  3.     InitializeComponent();  
  4.   
  5.     PictureBox picImg = new PictureBox();  
  6.     int width = 100;  
  7.     int height = 60;  
  8.     picImg.Width = width;  
  9.     picImg.Height = height;  
  10.     Image res = Image.FromFile("01.gif");  
  11.     Image gif = new Bitmap(width, height);  
  12.     Image frame = new Bitmap(width, height);  
  13.     Graphics g = Graphics.FromImage(gif);  
  14.     Rectangle rg = new Rectangle(0, 0, width, height);  
  15.     Graphics gFrame = Graphics.FromImage(frame);  
  16.     MemoryStream ms = new MemoryStream();  
  17.   
  18.     foreach (Guid gd in res.FrameDimensionsList)  
  19.     {  
  20.         FrameDimension fd = new FrameDimension(gd);  
  21.         FrameDimension f = FrameDimension.Time;  
  22.         int count = res.GetFrameCount(fd);  
  23.         ImageCodecInfo codecInfo = GetEncoder(ImageFormat.Gif);  
  24.         System.Drawing.Imaging.Encoder encoder = System.Drawing.Imaging.Encoder.SaveFlag;  
  25.         EncoderParameters eps = null;  
  26.   
  27.         for (int i = 0; i < count; i++)  
  28.         {  
  29.             res.SelectActiveFrame(f, i);  
  30.             if (i == 0)  
  31.             {  
  32.   
  33.                 g.DrawImage(res, rg);  
  34.   
  35.                 eps = new EncoderParameters(1);  
  36.   
  37.                 //第一帧需要设置为MultiFrame   
  38.   
  39.                 eps.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame);  
  40.                 bindProperty(res, gif);  
  41.                 gif.Save(ms, codecInfo, eps);  
  42.             }  
  43.             else  
  44.             {  
  45.   
  46.                 gFrame.DrawImage(res, rg);  
  47.   
  48.                 eps = new EncoderParameters(1);  
  49.   
  50.                 //如果是GIF这里设置为FrameDimensionTime,如果为TIFF则设置为FrameDimensionPage   
  51.   
  52.                 eps.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.FrameDimensionTime);  
  53.   
  54.                 bindProperty(res, frame);  
  55.                 gif.SaveAdd(frame, eps);  
  56.             }  
  57.         }  
  58.   
  59.         eps = new EncoderParameters(1);  
  60.         eps.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush);  
  61.         gif.SaveAdd(eps);  
  62.     }  
  63.     picImg.Image = Image.FromStream(ms);  
  64.     this.Controls.Add(picImg);  
  65. }  
  66.   
  67. private void bindProperty(Image a, Image b)  
  68. {  
  69.   
  70.     //这个东西就是每一帧所拥有的属性,可以用GetPropertyItem方法取得这里用为完全复制原有属性所以直接赋值了   
  71.   
  72.     //顺便说一下这个属性里包含每帧间隔的秒数和透明背景调色板等设置,这里具体那个值对应那个属性大家自己在msdn搜索GetPropertyItem方法说明就有了   
  73.   
  74.     for (int i = 0; i < a.PropertyItems.Length; i++)  
  75.     {  
  76.         b.SetPropertyItem(a.PropertyItems[i]);  
  77.     }  
  78. }  
  79.   
  80. private ImageCodecInfo GetEncoder(ImageFormat format)  
  81. {  
  82.   
  83.     ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();  
  84.   
  85.     foreach (ImageCodecInfo codec in codecs)  
  86.     {  
  87.         if (codec.FormatID == format.Guid)  
  88.         {  
  89.             return codec;  
  90.         }  
  91.     }  
  92.     return null;  
  93. }  
  94. GDI+ 中发生一般性错误。
  95. ErrorCode:-2147467259
chenhp的主页 chenhp | 初学一级 | 园豆:9
提问于:2014-09-01 14:57
< >
分享
所有回答(1)
0

不知道你的具体错误所指,所以不好回答你。

给你几个提示:

GDI是要用到设备指针的,在WINDOWS里,设备指针数量是有限的,好像是5个还是几个,所以,在使用GDI的时候,要养成一个习惯:GDI设备用完后就释放。

你确认下,问题是否这个原因。

519740105 | 园豆:5810 (大侠五级) | 2014-09-01 15:40

显然不是!

支持(0) 反对(0) chenhp | 园豆:9 (初学一级) | 2014-09-01 15:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册