無法從帶有索引像素格式的圖像創建graphics對象問題解決

          無法從帶有索引像素格式的圖像創建graphics對象問題解決
          Graphics.FromImage 方法

          今天在一個項目中突然遇到一個問題,上傳圖片不能上傳。于是斷點跟蹤。程序每次運行到Graphics g = Graphics.FromImage(img);就爆出如下錯誤:

          “無法從帶有索引像素格式的圖像創建graphics對象”這個錯誤,對應的英文錯誤提示是“A Graphics object cannot be created from an image that has an indexed pixel format”
          于是通過查詢 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>
          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進行水印操作
              }
          }

          本博客所有文章如無特別注明均為原創

          如果覺得對你有幫助,可以通過下方打賞對作者表示鼓勵

          本文采用知識共享署名-非商業性使用-相同方式共享

          如若轉載,請注明出處:《無法從帶有索引像素格式的圖像創建graphics對象問題解決》http://www.solariosolutions.com/825.html

          (1)
          打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
          鋒哥的頭像鋒哥管理員
          上一篇 2014年4月22日 20:00
          下一篇 2014年5月13日 09:32

          相關推薦

          發表回復

          登錄后才能評論
          国产厨房乱子伦露脸,XXXXAAA欧美,日本 888 XXXX,国产欧美日韩一区二区图片