- - PR -
bitmap.saveがうまくいかない。
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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: との内容の例外が起きてしまいます。どうしてでしょうか。ご教授ください。よろしくお願い致します。 |
|
投稿日時: 2009-03-16 14:50
Encoder.Quality の EncoderParameter 作るときは、EncoderParameter の第二引数は long じゃないと駄目じゃなかったかと。
明示的にキャストするとか L サフィクスをつけるとか。 // なんで VB で不要なのかは知りません。 |
|
投稿日時: 2009-03-16 15:03
うぉーーっ! 出来ました。大感謝! 今までVBで楽してたぶん苦労してます。本当にありがとうございました。またよろしくお願い致します。
|
1