程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> 無法從帶有索引像素格式的圖像創建 Graphics 對象。

無法從帶有索引像素格式的圖像創建 Graphics 對象。

編輯:C#基礎知識
大家在用 .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("圖片路徑")

這個調用的語句上,通過查詢 MSDN, 我們可以看到,是因為圖片是索引像素格式的。為了避免此問題的發生,我們在做水印之前,可以先判斷原圖片是否是索引像素格式的,如果是,則可以采用將此圖片先clone到一張BMP上的方法來解決:

/// <summary>
/// 會產生graphics異常的PixelFormat
/// </summary>
private static PixelFormat[] indexedPixelFormats = { PixelFormat.Undefined, PixelFormat.DontCare,
PixelFormat.Format16bppArgb1555, PixelFormat.Format1bppIndexed, PixelFormat.Format4bppIndexed,
PixelFormat.Format8bppIndexed
};

/// <summary>
/// 判斷圖片的PixelFormat 是否在 引發異常的 PixelFormat 之中
/// </summary>
/// <param name="imgPixelFormat">原圖片的PixelFormat</param>
/// <returns></returns>
private static bool IsPixelFormatIndexed(PixelFormat imgPixelFormat)
{
foreach (PixelFormat pf in indexedPixelFormats)
{
if (pf.Equals(imgPixelFormat)) return true;
}

return false;
}

//.........使用
using (Image img = Image.FromFile("原圖片路徑"))
{
//如果原圖片是索引像素格式之列的,則需要轉換
if (IsPixelFormatIndexed(img.PixelFormat))
{
Bitmap bmp = new Bitmap(img.Width, img.Height, PixelFormat.Format32bppArgb);
using (Graphics g = Graphics.FromImage(bmp))
{
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.DrawImage(img, 0, 0);
}
//下面的水印操作,就直接對 bmp 進行了
//......
}
else //否則直接操作
{
//直接對img進行水印操作
}
}

總結以下:
先創建一個和原圖一樣大小的Bitmap。
然後用Graphics.DrawImage,把要處理的圖片繪制到創建的空白Bitmap上。
處理這個自己創建的Bitmap就可以了。

Graphics g;
if (IsPixelFormatIndexed(img.PixelFormat))
{
Bitmap bitmap = new Bitmap(img, img.Width, img.Height);
img = bitmap; g = Graphics.FromImage(img);
//return AddTextToImg(img, "索引格式");
}
else
{
g = Graphics.FromImage(img);
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved