"无法从带有索引像素格式的图像创建graphics对象" 解决

大家在用 .NET 做图片水印功能的时候, 很可能会遇到 “无法从带有索引像素格式的图像创建graphics对象”这个错误,对应的英文错误提示是“A Graphics object cannot be created from an image that has an indexed pixel format"

这个exception是出现在 System.Drawing.Graphics g = System.Drawing.Graphics.FromImage("图片路径")  

原因是因为图片是索引像素格式的。为了避免此问题的发生,我们在做水印之前,可以先判断原图片是否是索引像素格式的,如果是,则可以采用将此图片先clone到一张BMP上的方法来解决: 

 


 1/// <summary>
 2/// 会产生graphics异常的PixelFormat
 3/// </summary>
 4private static PixelFormat[] indexedPixelFormats = { PixelFormat.Undefined, PixelFormat.DontCare,
 5PixelFormat.Format16bppArgb1555, PixelFormat.Format1bppIndexed, PixelFormat.Format4bppIndexed,
 6PixelFormat.Format8bppIndexed
 7    };
 8
 9/// <summary>
10/// 判断图片的PixelFormat 是否在 引发异常的 PixelFormat 之中
11/// </summary>
12/// <param name="imgPixelFormat">原图片的PixelFormat</param>
13/// <returns></returns>
14private static bool IsPixelFormatIndexed(PixelFormat imgPixelFormat)
15{
16    foreach (PixelFormat pf in indexedPixelFormats)
17    {
18        if (pf.Equals(imgPixelFormat)) return true;
19    }
20
21    return false;
22}
23
24//使用
25using (Image img = Image.FromFile("原图片路径"))
26{
27    //如果原图片是索引像素格式之列的,则需要转换
28    if (IsPixelFormatIndexed(img.PixelFormat))
29    {
30        Bitmap bmp = new Bitmap(img.Width, img.Height, PixelFormat.Format32bppArgb);
31        using (Graphics g = Graphics.FromImage(bmp))
32        {
33            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
34            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
35            g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
36            g.DrawImage(img, 0, 0);
37        }
38        //下面的水印操作,就直接对 bmp 进行了
39        //
40    }
41    else //否则直接操作
42    {
43         //直接对img进行水印操作
44    }
45}

 



经过上面的操作, 就可以避免因图片的索引信息而引发异常了。


欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!http://www.cnblogs.com/sunshine-anycall/archive/2009/02/10/1387411.html

时间: 2024-08-30 14:09:57

"无法从带有索引像素格式的图像创建graphics对象" 解决的相关文章

像素格式

像素格式 像素格式(pixel format)像素色彩按分量的大小和排列.这种格式以每个像素所使用的总位数以及用于存储像素色彩的红.绿.蓝和 alpha 分量的位数指定. 目录 [hide] 1 像素格式 2 颜色通道 3 全部格式 4 格式笔记 5 WPF格式 像素格式 像素格式描述了像素数据存储所用的格式.定义了像素在内存中的编码方式.下面的像素格式 (PF_*) 类型定义了:本地格式 (PF_A8R8G8B8 以及其他大量的不同的类型)这意味着在内存中使用了本地储存方式(big endia

Photoshop怎么绘制像素风格的图像和人物

  Photoshop怎么绘制像素风格的图像和人物?先看下像素画的案例 等下我用这个简单的案例进行绘画 1.创建角色的身体 通常我会建议先从头部,这仍然是一个可行的起点,但因为这个角色将是如此简单,它的比例会有些逼真,身体会启动一个同样的好去处. 你需要在Adobe Photoshop建立一个新文件.(100像素*100像素) ; 我所做的字符只有28像素高. 步骤1 让我们定义一个肤色. 第2步 选择铅笔工具用1像素点的尺寸 . 随着我们新创建的颜色,画出腿,这将是2像素跨越每条腿之间有一个空

opencv 区域检测-如何利用opencv对ycbcr格式的图像求重心

问题描述 如何利用opencv对ycbcr格式的图像求重心 如题,在opencv中将普通格式的图像转化为ycbcr用以检测肤色后,如何对图像求重心?是利用cvmoments吗?但是这个函数好像只能用于二值化图像,程序运行到一半会报错求大神解答 解决方案 利用opencv求图像重心 解决方案二: 重心这种计算,一般都是针对二值图或者单通道进行的,你可以对Y通道进行二值化,然后再计算重心!还有,计算重心的算法很简单,没必要非要用opencv,自己写一个都可以! 解决方案三: 一般某个核心的研究成果,

代码-bmp格式的图像转为原始rgb24的图像数据,可以用rawplayer直接播放

问题描述 bmp格式的图像转为原始rgb24的图像数据,可以用rawplayer直接播放 bmp格式的图像转为原始rgb24的图像数据,可以用rawplayer直接播放,希望大神帮忙!!!求C的源程序代码,最好带注释,我是新手

jquery带有索引按钮且自动轮播切换特效代码分享_jquery

本文实例讲述了jquery带有索引按钮且自动轮播切换特效.分享给大家供大家参考.具体如下: 这是一款基于jquery实现的带有索引按钮且自动轮播切换特效代码,实现过程很简单. 运行效果图:                              -------------------查看效果 下载源码------------------- 小提示:浏览器中如果不能正常运行,可以尝试切换浏览模式. 在head区域引入CSS样式: <link rel="stylesheet" hr

图标制作软件:如何从web图像创建一个图标

在一些电脑图标下载网站上,我们常常能看到很多的图标制作素材.甚至是已经制作完成的图标,如果我们想使用这些现成图标,并一定非得把它们下载到自己电脑上才能使用.Iconworkshop图标制作软件能够直接将这些网页上的图标"挪为己用",下面一起学习如何从web图像创建新图标. 图标制作软件官方Iconworkshop下载地址:http://www.iconworkshop.cn/xiazai.html 第一步:在Iconworkshop输入网址.打开Axialis Iconworkshop

javascript 日期格式, url提取及分解,对象代码

网页特效 日期格式, url提取及分解,对象代码 一个简单js入门教程主要是包括了日期格式, url提取及分解,对象的操作,希望对你有帮助. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.

根据图像路径,创建CBitmap对象的方法

 因为项目的关系,需要根据图像路径,创建CBitmap对象.起初查资料找到了LoadBitmap这个函数,根据CSDN得 BOOL LoadBitmap ( LPCTSTR lpszResourceName ); Parameters lpszResourceName:Points to a null-terminated string that contains the name of the bitmap resource.   以为这里的lpszResourceName参数是文件路径名,但

php简单图像创建入门实例_php技巧

本文实例讲述了php简单图像创建方法.分享给大家供大家参考.具体实现方法如下: <?php $image = imagecreatetruecolor(200,100); $text_color = imagecolorallocate($image,255,255,255); imagestring($image,5,0,0,"Hello World!",$text_color); imagepng($image); imagedestroy($image); ?> 运行