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

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

2015-05-15 十有三 2 浏览:2万+ .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不支持维护计划功能

相关文章
  • IIS上设置ARR导致所有网站无法正常打开
  • ASP.NET中.aspx页面使用<script runat="server">标记无法输出"</script>"字符串
  • C#中将一串数字格式字符串转换成日期DateTime类型
  • C# String.Substring(Int32, Int32)超出长度是否会出错
  • 修改Discuz!NT源码出现'List' is an ambiguous reference(即不明确的引用)错误
  • 解决IIS ASP.NET 网站发布后出现错误 Unable to connect to any of the specified MySQL hosts

文章分类

.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重构重命名的快捷键

推荐文章

  • Win10 自动换壁纸软件失效-无法换壁纸并被强制切换为默认壁纸
  • 解决ASP.NET MVC AllowAnonymous属性无效导致无法匿名访问控制器的问题
  • IE11 Exception in window.onload: Error: An error has ocurredJSPlugin.3005
  • 一次头疼的IIS故障经历:IIS 8.5的URL重写模块无法正常运行
  • ASP.NET MVC实现IExceptionFilter接口编写自定义异常处理过滤器

友情链接

  • 码友网

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