くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

GDI+

.netMVCのGDI+エラーをどうにか回避したい その2

以前、GDI+のエラーを回避したい的なのを書いた。その続き。

前回書いたものは今のとこ大丈夫そうなんだけど、使用してるライブラリで内部でDrawing使ってるやつもダメになってるね。当たり前だけども。詰みかな?

ちなみに、エクセル操作するEPPlusってやつを使って、エクセルに画像を貼る際に、Drawing使ってるらしくやられました。

結構、根が深いんじゃなかろーか。さてどうしましょう。

マイクロソフトさんに頑張っていただくしかなかね。。。

.netMVCのGDI+エラーをどうにか回避したい

この前、.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から呼ぶ場合のがどうしてもわからなかった。何となく、フォントの指定がうまくできない。気が向いたら調べてみよう。

C# .netMVCでGDI+のエラー

ちんまい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を見てみると↓の事がかいてあった。

img01

・・・・・・ん!?

ASP.NET サービス内での使用はサポートされません。

使うなって事なのねん。何かが競合することでもあるんだろうかと愚考。

つか、.net4.0までは上の注意書きがないとゆー罠。4.5からサポートしなくなった模様。

なんか別のライブラリ的なサムシングエルスを使うしかあるまい。。。

2017/4/12追記 続き

MSDN

問合せ