以前、GDI+のエラーを回避したい的なのを書いた。その続き。
前回書いたものは今のとこ大丈夫そうなんだけど、使用してるライブラリで内部でDrawing使ってるやつもダメになってるね。当たり前だけども。詰みかな?
ちなみに、エクセル操作するEPPlusってやつを使って、エクセルに画像を貼る際に、Drawing使ってるらしくやられました。
結構、根が深いんじゃなかろーか。さてどうしましょう。
マイクロソフトさんに頑張っていただくしかなかね。。。
プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。
以前、GDI+のエラーを回避したい的なのを書いた。その続き。
前回書いたものは今のとこ大丈夫そうなんだけど、使用してるライブラリで内部でDrawing使ってるやつもダメになってるね。当たり前だけども。詰みかな?
ちなみに、エクセル操作するEPPlusってやつを使って、エクセルに画像を貼る際に、Drawing使ってるらしくやられました。
結構、根が深いんじゃなかろーか。さてどうしましょう。
マイクロソフトさんに頑張っていただくしかなかね。。。
この前、.NetMVCのWebアプリでSystem.Drawing使って画像作るとGDI+エラーが出るっていうの書いた。
System.Drawing使えないとなると結構しんどいので、他のライブラリを使ってみる。画像っていったらやっぱりImageMagickかしらね。ちょっと調べてみると結構色々あるのね。↓のやつら。
ImageSharpなんか良さげなので使ってみよーかと思ったら、.net4.5は対応外だそうです。残念。対応したら使ってみよ。
で、結局ImageMagick(Magick.NET)に落ちついたわけですが。Nugetでインストールして↓の感じで作ってみた。
//全部をImageMagickでやるのはしんどかったので、 //エラーが出るところだけ書き換え Color c = Color.FromArgb(0xFF, Color.FromArgb(Convert.ToInt32("0xD9333F", 16))); Font f = new Font("MS 明朝", 12); using (Bitmap img = new Bitmap(100, 64)) { using (Graphics g = Graphics.FromImage(img)) using (Pen pen = new Pen(c)) { g.DrawLine(pen, 0, 0, 100, 0); g.DrawString("Something Text...", f, new SolidBrush(c), 5, 5); } string folder = "適当なフォルダ"; string filename = "適当なファイル名"; fullFileName = System.IO.Path.Combine(folder, filename); //GDI+エラーが出るのは保存のところ ↓の感じ //img.Save(fullFileName, ImageFormat.Png); //↑の保存をImageMagickを使って保存に変える using (ImageMagick.MagickImage image = new ImageMagick.MagickImage(img)) { image.Format = ImageMagick.MagickFormat.Png; image.Write(fullFileName); } }
今のところエラーは出てないけど、様子見なり。
で、保存の部分だけ使ったのですが、ホントはImageMagickで日本語のテキスト出せなかったので保存だけに逃げました。
コマンドラインから使う場合は出す方法が色々見つかるんだけど、.netから呼ぶ場合のがどうしてもわからなかった。何となく、フォントの指定がうまくできない。気が向いたら調べてみよう。
ちんまいWebアプリの中で、Drawingを使って画像を作ってる場所があるんだけど、最近そこの部分ではまった。
画像を保存するところで、唐突に「GDI+ で汎用エラーが発生しました。」で落ちることがある。発生するとIISResetするまで発生し続ける。ソース的には↓の感じ。
Bitmap img = new Bitmap(100, 64); Color c = Color.FromArgb(0xFF, Color.FromArgb(Convert.ToInt32("0xD9333F", 16))); Graphics g = Graphics.FromImage(img); Pen pen = new Pen(c); g.DrawLine(pen, 0, 0, 100, 0); img.Save(".\HOGE\FUGA.png", ImageFormat.Png);//ここでエラー。
検索してみると、「ファイルパスがおかしいと落ちる」・「パスが長すぎると落ちる」・「ファイルから読み込んでそのまま保存とかしようとすると落ちる」・「フォルダの権限が足りないと落ちる」などなどいくつか出てくる。
ただ、↑くらいの話は結構誰でも知ってるポイントなので、何度も確認している。でも落ちる。
基本に立ち返り、MSDNを見てみると↓の事がかいてあった。
・・・・・・ん!?
ASP.NET サービス内での使用はサポートされません。
使うなって事なのねん。何かが競合することでもあるんだろうかと愚考。
つか、.net4.0までは上の注意書きがないとゆー罠。4.5からサポートしなくなった模様。
なんか別のライブラリ的なサムシングエルスを使うしかあるまい。。。
2017/4/12追記 続き