/*十有三博客*/
  • 首页
  • 关于本站
  • 网站地图
  • RSS订阅

无法从带有索引像素格式的图像创建 Graphics 对象

2015-05-15 十有三 2 浏览:1万+ .NET技术 ASP.NET

在使用Graphics.FromImage方法的时候,如果传入的System.Drawing.Image图像是索引像素格式,那么将会引发异常并提示以下消息:“无法从带有索引像素格式的图像创建 Graphics 对象。”。

先说下本人遇到的具体情况:由于网站需要添加一个上传图片自动打水印的功能,所以需要使用System.Drawing.Graphics类对图像重新绘制,将水印图片绘制到图片上。但在实际测试中,发现上传图片后,有的图片可以打水印成功,有的则会抛出异常,出现错误信息:A Graphics object cannot be created from an image that has an indexed pixel format。

后来断点调试,发现主要出错的地方是在Graphics.FromImage方法那,查阅了MSDN才发现这是由于索引像素格式的图片造成的(一般大多数的GIF格式图片都是这种类型):

引发异常的像素格式

官方文档:https://msdn.microsoft.com/zh-cn/library/system.drawing.graphics.fromimage.aspx


这里说下解决的思路,既然问题出在索引像素格式的图像上,那么只要对其进行处理即可。

根据官方文档所描述,一共有这8种像素格式会出现带有索引像素格式的图像无法创建 Graphics 对象的错误:Format1bppIndexed、Format4bppIndexed、Format8bppIndexed、Undefined、DontCare、Format16bppArgb1555、Format16bppGrayScale。

我们使用下面的方法来判断图像的像素格式是否会引发异常:

/// <summary>
/// 判断图片是否索引像素格式,是否是引发异常的像素格式
/// </summary>
/// <param name="imagePixelFormat">图片的像素格式</param>
/// <returns></returns>
private bool IsIndexedPixelFormat(System.Drawing.Imaging.PixelFormat imagePixelFormat)
{
    PixelFormat[] pixelFormatArray = {
                                            PixelFormat.Format1bppIndexed
                                            ,PixelFormat.Format4bppIndexed
                                            ,PixelFormat.Format8bppIndexed
                                            ,PixelFormat.Undefined
                                            ,PixelFormat.DontCare
                                            ,PixelFormat.Format16bppArgb1555
                                            ,PixelFormat.Format16bppGrayScale
                                        };
    foreach (PixelFormat pf in pixelFormatArray)
    {
        if (imagePixelFormat == pf)
        {
            return true;
        }
    }
    return false;
}

我们只要传入当前Image对象的PixelFormat属性,就可以判断当前图像是否会抛出异常。那么接下来就可以根据自己的业务需求进行操作。

这里有多种方法,比如官方文档上所说的使用Image.Save(String, ImageFormat) 方法将索引的图像保存为另一种格式,然后为此新图像检索 Graphics 对象。

也可以使用Graphics.DrawImage方法将图像重新绘制到一个Bitmap对象中,并指定像素格式,从而去除索引,简单的范例:

using (System.Drawing.Image img = System.Drawing.Image.FromFile("要打水印的图片的路径"))
{

    if (IsIndexedPixelFormat(img.PixelFormat))
    {
        Bitmap bmp = new Bitmap(img.Width, img.Height, PixelFormat.Format32bppArgb);
        using (Graphics g = Graphics.FromImage(bmp))
        {
            g.DrawImage(img, 0, 0);
        }
    }
}

当然也可以直接禁止对索引像素格式的图片进行操作,如果想要偷懒,还可以直接使用try catch将异常捕获处理。无论使用什么方法,就是一定要注意带有索引像素格式的图片不能使用FromImage方法Graphics对象。


作者:十有三

出处:https://shiyousan.com/post/635673069844570958

版权声明:本文采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。欢迎转载本文,转载请声明出处或保留此段声明。


  • 上一篇: ASP.NET MVC网站发布后出现“/”应用程序中的服务器错误。
  • 下一篇: SQL Server Express不支持维护计划功能

相关文章
  • IIS8通过ARR和URL重写模块实现不同站点之间的POST请求重写
  • ASP.NET MVC 统一化自定义异常处理方案的选择
  • .Net Framework4.0 ashx页面报错:检测到有潜在危险的Request.Form值
  • 记录Vs2013中文语言包安装卡住进度条不动的问题
  • ASP.NET 301跳转或者进行301重定向/转向的方法
  • ASP.NET HTTP 状态字符串无效

文章分类

.NET技术 123 数据库 24 Web前端 21 网站建设运维 37 操作系统与应用 66 程序猿日常 11 开发工具 12 其他随笔 13

文章标签

ASP.NET ASP.NET MVC C# CSS HTML IIS Javascript Linux MongoDB MySql SQL SQL Server Visual Studio Windows系统 版本控制系统 插件工具 服务器 搞笑娱乐 好文分享 软件应用 生活知识 手机问题 随笔 网络知识 网站设计优化 网站维护 养生保健 异常处理 硬件设备 游戏攻略

热门文章

  • IIS8如何安装和使用URL重写工具-URL Rewrite
  • 林蛋大与楚中天,朱肚皮与朱月坡
  • 解决IE11安装升级失败和在安装前需要更新的问题
  • Windows Server 2012无法安装 .NET3.5-安装角色或功能失败,找不到源文件
  • VS重构重命名的快捷键

推荐文章

  • 解决VS2013错误:Page '312e8a59-2712-48a1-863e-0ef4e67961fc' not found.
  • 研究下CSS3的background-size属性
  • 个人对C#控制台应用程序在运用方面的总结
  • 解决向日葵远程控制软件鼠标滚轮失效无法上下滚动
  • 解决出现"WARNING:Looks like theres a ' xlive.dll’ in the game path,please delete it to get GFWL work"警告框问题

友情链接

  • Passingwind的博客
  • 码友网

知识共享许可协议 CC BY-SA 4.0本站作品采用知识共享许可协议:署名-相同方式共享 4.0 国际(CC BY-SA 4.0)。
闽ICP备15003702号
闽公网安备 35020302035102号