专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » gdi错误:GDI+中发生一般性错误的解决方法 »正文

gdi错误:GDI+中发生一般性错误的解决方法

来源: 发布时间:星期四, 2009年2月12日 浏览:259次 评论:0


有这么段将从数据库读出图片字节转换为图片:

public Image ArrayToImage( ArrayIn)
{
try
{
(ArrayIn.Length > 0)
{
using (MemoryStream ms = MemoryStream(ArrayIn))
{
Image Image = Image.FromStream(ms);
ms.Close;
Image;
}
}
null;
}
catch
{}
}
外部是这样 :

try
{
pbox_图片1.Image = ImageByteConvert.ArrayToImage(()(row_道班房屋["图片1"]));
}
catch
{
}
pbox_图片2.Image = null;
try
{
pbox_图片2.Image = ImageByteConvert.ArrayToImage(()(row_道班房屋["图片2"]));
}
catch
{
}
数据库中有两条记录每条记录有2张图片使用第条记录时没有任何问题但是使用第 2条记录时如果执行

try
{
pbox_图片1.Image = ImageByteConvert.ArrayToImage(()(row_道班房屋["图片1"]));
}
catch
{
}
就会出现这样情况:

以上代码异常捕获都没有捕捉到异常但是当

Form_Load(object sender, EventArgs e)
{
...
...
...
}
执行完毕后就会引发“GDI+中发生般性

然而不执行

try
{
pbox_图片1.Image = ImageByteConvert.ArrayToImage(()(row_道班房屋["图片1"]));
}
catch
{
}
单独执行

pbox_图片2.Image = null;
try
{
pbox_图片2.Image = ImageByteConvert.ArrayToImage(()(row_道班房屋["图片2"]));
}
catch
{
}
就不会出现异常让人很是郁闷后来参考了这篇文章:http://www.cnblogs.com/kiddo/articles/1093497.html



GDI+中发生般性终极解决办法!
by 程晨chengchen.net
我遇到情况:
在编写Chem.NET时候要保存图片我先用openFileDialog打开图片文件然后用saveFileDialog保存文件时就出现了 “GDI+中发生般性我当时就想到是打开文件还没有释放出来于是用openFileDialog1.Dispose来释放可是没有成功同样从个MemorySream 例子打开个Image后立即关闭了这个流结果在Image.Save时也会发生这种我“摆渡”了很久都是遇到和我样问题CSDN上面同志也没有给出个实用答案最后终于还是在微软网站WebSite上找到了答案:(以下是官方解决办法)

症状
Bitmap 对象或个 图像 对象从个文件, 构造时该文件仍保留锁定对于对象生存期 因此, 无法更改图像并将其保存回它产生相同文件

替代思路方法
• 创建非索引映像
• 创建索引映像
这两种情况下, 原始 位图 上 Bitmap.Dispose 思路方法删除该文件上锁或删除要求 流或内存保持活动

创建非索引图像
即使原始映像被索引格式中该思路方法要求新图像位于每像素 (超过 8 位 -) -, 非索引像素格式 此变通思路方法使用 Graphics.DrawImage 思路方法来将映像复制到新 位图 对象:
1. 构造从流、 从内存, 或从文件原始 位图
2. 创建新 位图 相同大小, 带有是超过 8 位 - - 像素 (BPP) 每像素格式
3. 使用 Graphics.FromImage 思路方法以获取有关 2 位图 Graphics 对象
4. 用于 Graphics.DrawImage 绘制首 位图 到 2 位图
5. 用于 Graphics.Dispose 处置是 图形
6. 用于 Bitmap.Dispose 是首 位图 处置

创建索引映像
此解决办法在索引格式创建个 Bitmap 对象:
1. 构造从流、 从内存, 或从文件原始 位图
2. 创建新 位图 具有相同大小和像素格式作为首 位图
3. 使用 Bitmap.LockBits 思路方法来锁定整个图像对于两 Bitmap 对象以其本机像素格式
4. 使用 Marshal.Copy 或其他内存复制来从首 位图 复制到 2 位图 图像位
5. 使用 Bitmap.UnlockBits 思路方法可以解锁两 Bitmap 对象
6. 用于 Bitmap.Dispose 是首 位图 处置
由于外国人思维和我们不我重新用例子解释我这里使用是创建非索引图像

private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
(openFileDialog1.ShowDialog DialogResult.OK)
{
//创建个bitmap类型bmp变量来读取文件
Bitmap bmp = Bitmap(openFileDialog1 .FileName );
//新建第 2个bitmap类型bmp2变量我这里是根据我需要设置
Bitmap bmp2 = Bitmap(1024, 768, PixelFormat.Format16bppRgb555);
//将第个bmp拷贝到bmp2中
Graphics draw = Graphics.FromImage(bmp2);
draw.DrawImage(bmp,0,0);
pictureBox1.Image = (Image)bmp2 ;//读取bmp2到picturebox
FILE = openFileDialog1.FileName;
openFileDialog1.Dispose;
draw.Dispose;
bmp.Dispose;//释放bmp文件资源
}
}
通过以上读取文件在保存时候就不会出现



将转换改为这样:

public Image ArrayToImage( ArrayIn)
{
try
{
(ArrayIn.Length > 0)
{
using (MemoryStream ms = MemoryStream(ArrayIn))
{
Bitmap Origninal = Bitmap(ms);
Bitmap Bmp = Bitmap(Origninal.Width,Origninal.Height);
Graphics g = Graphics.FromImage(Bmp);
g.DrawImage(Origninal, 0, 0);
ms.Close;
(Image)Bmp;


}
}
null;
}
catch
{
null;
}
}
使用两条记录中任何条都没出现异常
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: