GDI+ 中发生一般性错误的解决方案
2012-09-23 10:15阅读:
在开发.NET应用中,使用 System.Drawing.Image.Save
方法而导致“GDI+ 中发生一般性错误”的发生,通常有以下三种原因:
1. 相应的帐户没有写权限。
解决方法:赋予 NETWORK SERVICE
帐户以写权限。
2. 指定的物理路径不存在。
解决方法:
在调用 Save
方法之前,先判断目录是否存在,若不存在,则创建。
if
(!Directory.Exists(dirpath))
Directory.CreateDirectory(dirpath);
3.
保存的文件已存在并因某种原因被锁定。
解决方法:
重启IIS,解除锁定。并在代码中使用 using
语句,确保释放 Image 对象所使用的所有资源。
我遇到的情况:
FONT>
Bitmap 对象或一个 图像 对象从一个文件, 构造时该文件仍保留锁定对于对象的生存期。
因此, 无法更改图像并将其保存回它产生相同的文件。
参考原文地址(http://www.cnblogs.com/wudingfeng/archive/2008/07/24/1250564.html)
一般情况下由于文件已经存在而且由于某种原因被锁定而出现问题的可能性比较大,最近在研究有关W4a音乐文件数据信息获取时遇到了(GDI+
中发生一般性错误)的情况,参考了以上的资料后结合自身的项目解决问题。
code:
private void Initialize()
{
string
Path = @'C:\Users\Vincent\Documents\My
WiSync\Music\[mhjj上传][郭静][在树上唱歌][NeroAAC-280k-320k]';
string
path = Path + @'\03 想个不停.m4a';
string
path2 = Path + @'\1.jpg';
DataTable dt = new DataTable();
dt.Columns.Add('Title');
dt.Columns.Add('AlbumPicture');
dt.Columns.Add('VM_AlbumArtist');
dt.Columns.Add('Duration');
dt.Columns.Add('VM_AlbumTitle');
dt.Columns.Add('VM_Genre');
dt.Columns.Add('Vm_Year');
dt.Columns.Add('CreationTime');
DataRow
dr = dt.NewRow();
MusicInfo musicInfo = this.LoadTags(path);
dr['Title'] = musicInfo.Title;
dr['VM_AlbumArtist'] =
musicInfo.Vm_AlbumArtist;
dr['Duration'] = musicInfo.Duration;
dr['VM_AlbumTitle'] = musicInfo.Vm_AlbumTitle;
dr['VM_Genre'] = musicInfo.Vm_Genre;
dr['Vm_Year'] = musicInfo.Vm_Year;
dr['CreationTime'] = musicInfo.CreationTime;
if
(File.Exists(path2))
{
// File.Delete(path2);
}
Bitmap bmp = LoadAtoms(path);
//新建第二个bitmap类型的bmp2变量,我这里是根据我的程序需要设置的。
Bitmap
bmp2 = new Bitmap(100, 100,
PixelFormat.Format16bppRgb555);
//将第一个bmp拷贝到bmp2中
Graphics draw = Graphics.FromImage(bmp2);
draw.DrawImage(bmp, 0, 0);
bmp.Dispose(); //原来获取到的对象对象被锁定不能直接保存。因此得释放掉。
try
{
if (!Directory.Exists(Path))
Directory.CreateDirectory(Path);
bmp2.Save(path2);
}
catch
{
}
dr['AlbumPicture'] = 'StreamPage.aspx?file=' +
Server.UrlEncode(path2);
dt.Rows.Add(dr);
this.gvMusic.DataSource = dt;
this.gvMusic.DataBind();
}
private MusicInfo
LoadTags(string path)
{
MusicInfo musicInfo = new MusicInfo();
m4aTags
tags = new m4aTags(path);
tags.Load();
foreach
(KeyValuePair<string, object> pair in
tags.Tags)
{
if (pair.Key == 'Title')
{
musicInfo.Title =
pair.Value.ToString();
}
if (pair.Key == 'WM/AlbumArtist')
{
musicInfo.Vm_AlbumArtist =
pair.Value.ToString();
}
if (pair.Key == 'WM/AlbumTitle')
{
musicInfo.Vm_AlbumTitle =
pair.Value.ToString();
}
if (pair.Key == 'WM/Genre')
{
musicInfo.Vm_Genre =
pair.Value.ToString();
}
if (pair.Key == 'WM/Year')
{
string wmYear =
pair.Value.ToString().Substring(0,
pair.Value.ToString().IndexOf('T'));
musicInfo.Vm_Year =
wmYear;
}
if (pair.Key == 'Duration')
{
musicInfo.Duration =
pair.Value.ToString();
}
if (pair.Key == 'CreationTime')
{
musicInfo.CreationTime =
pair.Value.ToString();
}
}
return
musicInfo;
}
///
<summary>
/// 返回音乐的图片
///
</summary>
/// <param
name='path'></param>
///
<returns></returns>
private Bitmap
LoadAtoms(string path)
{
m4aFile
file = new m4aFile(path);
file.Load();
Atom
cover =
file.GetAtom('moov.udta.meta.ilst.covr.data');
if
(cover != null)
return cover.InterpretData() as Bitmap;
else
{
return null;
}
}