- PR -

bitmap.saveがうまくいかない。

1
投稿者投稿内容
まんちゃん
常連さん
会議室デビュー日: 2006/12/21
投稿数: 25
投稿日時: 2009-03-16 14:31
いつもお世話になります。またお知恵を拝借に伺いました。いつも感謝しております。今回もよろしくお願い致します。

WEBアプリでのbitmap.Save処理を書いてます。VBで書いてうまく動いて、C#で書くとうまくいかないということが起きてしまいました。何がどう悪いのか教えてください。ずっと悩んでいます。

品質を指定してJPEG保存をする。
【VBでのコード】

......

Me.Response.ClearContent()
Me.Response.ContentType = "image/jpeg"
Dim st As IO.Stream
st = Me.Response.OutputStream
Dim bmp As Bitmap
Dim g As Graphics

bmp = New Bitmap(500, 500)
g = Graphics.FromImage(bmp)
g.Clear(Color.Black)

Dim myEPS As New System.Drawing.Imaging.EncoderParameters(1)
Dim myEP As New System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100)
myEPS.Param(0) = myEP
Dim myICI As System.Drawing.Imaging.ImageCodecInfo

myICI = GetEncodInfo("image/jpeg")

bmp.Save(st, myICI, myEPS)
End Sub

Private Shared Function GetEncodInfo(ByVal mineType As String) As System.Drawing.Imaging.ImageCodecInfo
'イメージコーデックを返す
'GDI+に組み込まれたイメージエンコーダーを取得
Dim myEncoders() As System.Drawing.Imaging.ImageCodecInfo = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders
Dim myEncoder As System.Drawing.Imaging.ImageCodecInfo

For Each myEncoder In myEncoders
If myEncoder.MimeType = mineType Then
Return myEncoder
End If
Next
Return Nothing
End Function

これはばっちり動きます。で同じようにC#で書いてみます。

【C#でのコード】


......

System.Drawing.Imaging.EncoderParameters myEPS = new System.Drawing.Imaging.EncoderParameters(1);

System.Drawing.Imaging.EncoderParameter myEP = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality,100);

myEPS.Param[0] = myEP;

System.Drawing.Imaging.ImageCodecInfo myICI;
myICI = GetEncoderInfo("image/jpeg");

bmp.Save(st,myICI,myEPS);    //←ここでエラー
g.Dispose();
bmp.Dispose();
}

//イメージコーデックを返す
//GDI+に組み込まれたイメージエンコーダーを取得
private static System.Drawing.Imaging.ImageCodecInfo
GetEncoderInfo(string mineType)
{
System.Drawing.Imaging.ImageCodecInfo[] encs =
System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
foreach (System.Drawing.Imaging.ImageCodecInfo enc in encs)
if (enc.MimeType == mineType)
return enc;
return null;
}

このコードを実行すると、bmp.saveの場所で、
System.ArgumentException はユーザー コードによってハンドルされませんでした。
Message="使用されたパラメータが有効ではありません。"
Source="System.Drawing"
StackTrace:
場所 System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)
場所 mpadservice_wa.wf_image.Page_Load(Object sender, EventArgs e) 場所 C:\Documents and Settings\ZJIRO.SYSTEM2017Y150\My Documents\Visual Studio 2008\Projects\mpadservice_c\mpadservice_wa\wf_image.aspx.cs:行 77
場所 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
場所 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
場所 System.Web.UI.Control.OnLoad(EventArgs e)
場所 System.Web.UI.Control.LoadRecursive()
場所 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
InnerException:
との内容の例外が起きてしまいます。どうしてでしょうか。ご教授ください。よろしくお願い致します。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2009-03-16 14:50
Encoder.Quality の EncoderParameter 作るときは、EncoderParameter の第二引数は long じゃないと駄目じゃなかったかと。
明示的にキャストするとか L サフィクスをつけるとか。
// なんで VB で不要なのかは知りません。
まんちゃん
常連さん
会議室デビュー日: 2006/12/21
投稿数: 25
投稿日時: 2009-03-16 15:03
うぉーーっ! 出来ました。大感謝! 今までVBで楽してたぶん苦労してます。本当にありがとうございました。またよろしくお願い致します。
1

スキルアップ/キャリアアップ(JOB@IT)