FileUploadを利用しての画像保存についての質問

このQ&Aのポイント
  • ASP.NETのフレームワークを使用して、POSTした画像を保存する方法について質問です。
  • 現在、FileUploadコントロールを利用して画像を保存しようとしていますが、色数が多い画像でエラーが発生してしまいます。
  • 画像のwidthとheightを取得し、pngやgif形式の画像もjpeg形式に変換して保存する方法について教えてください。
回答を見る
  • ベストアンサー

FileUploadを利用しての画像保存(再)

ASP.NET、フレームワークは.net4.0環境です。 言語はc sharpです。 FileUploadコンロールを使って、POSTした画像を保存するような ものを作りたいと考えています。 想定は4MB以内のファイルなのですが、4MB以内でも、色数が多いと うまくいかないようで悩んでいます。 以下のようなコードを書きました。 -- HttpPostedFile imageData = FileUpload1.PostedFile; //投稿ファイル byte[] buffer = new byte[imageData.InputStream.Length]; imageData.InputStream.Read(buffer, 0, Convert.ToInt32(imageData.InputStream.Length)); ImageConverter ImgConv = new ImageConverter(); Bitmap bitmapSave = (System.Drawing.Bitmap)ImgConv.ConvertFrom(buffer); bitmapSave.Save(temp_path, ImageFormat.Jpeg); //temp_pathには保存先のパスが入っています。 -- bitmapSave.Saveで、以下のようなエラーが出てしまいます。 -- ExternalExceptionがキャッチされました。 GDI+ で汎用エラーが発生しました。 -- 再現性がイマイチで、色数が少なければうまくいくようです。 ただ、たとえば以下のような色数の多い広告画像だとエラーに なってしまいます。 http://www.tsukumo.co.jp/shop/tirashi/akiba_02.html 画像のwidth、heightを見たいのと、pngやgifであってもjpegに 変換したいので、bitmap.Saveを使う形式でうまく保存できるように 直したいのですが、ご教授いただけないでしょうか。

  • ginfix
  • お礼率34% (330/962)

質問者が選んだベストアンサー

  • ベストアンサー
  • shockatz
  • ベストアンサー率80% (153/191)
回答No.1

現象確認しました。 大サイズのbitmap(jpeg約3MB -> 展開後約45MB)でjpeg保存エラー。 これ、ASP.NETというよりも、GDI+の一般的なエラーのようで、入出力に問題がなければ、内部リソースの欠乏とか、そんな原因でも起きているようですね。 GDI+のエラーは事例が多数ありますが、入出力のパスに問題がないとすると、内部リソースの確保とか。 http://www.codeproject.com/Questions/52709/C-Bitmap-Save-Generic-GDI-Error のSolution4/5あたりを試してみられればと。 自分は最初から、GDI+は大量メモリを多用する処理はNGのような気がして、外部コンポーネントで画像処理しています。 有償製品はGraphicMill、LeadToolsなどいっぱいありますが、無償のものでは、ImageResizer http://imageresizing.net/docs/howto/upload-and-resize あたりどうでしょう。

ginfix
質問者

補足

ありがとうございます。 無料のコンポーネントを使う方向で考えてみます…。

関連するQ&A

  • FileUploadを利用しての画像保存

    ASP.NET、フレームワークは.net4.0環境です。。 FileUploadコンロールを使って、POSTした画像を保存するような ものを作りたいと思っています。 FileUploadとButtonを設置して、以下のように書きました。 (C Sharpで書いたものです) --- protected void Button1_Click(object sender, EventArgs e) { if (FileUpload1.HasFile) { //ファイルを保存 HttpPostedFile imageData = FileUpload1.PostedFile; using (cbitmap = new Bitmap(imageData.InputStream)) { int test = bitmap.Width; bitmap.Save(@"C:\img_save\test.jpg", ImageFormat.Jpeg); } } } --- 画像のサイズが小さい時はうまくいくのですが、2MB少々のjpg画像を上記で 投稿しようとしたところ、Saveの箇所で以下のようなエラーが出てしまいます。 -- ExternalExceptionがキャッチされました。 GDI+ で汎用エラーが発生しました。 -- FileUPLoadの上限は4MBだったと思いますが、2MB程度で上記のような エラーが出てしまうのは何故でしょうか? InputStreamから、Bitmapとしているため、そこで容量を超えてしまうとか いうこともありますか…ね…? 最大3MBほどまでUP出来るようにしたいのですが、修正すべき点について アドバイスいただけないでしょうか。 宜しくお願いします。

  • 画像をJPEGのままで保存したいが・・・

    初歩的な質問かもしれませんが・・・ WinXPのマシンで例えばネット上のJPEG画像をそのまま保存しようとすると、BITMAPに勝手に変換されてしまいます。 あとでそれをJPEGに変換し直してはいますが、Win98SEのマシンでは同じネット上の同じ画像を保存する際は、どちらでも選べます。 WinXPの設定が違うのですかねぇ? 確かにちょっと前(2、3ヶ月前?)はJPEGで普通に保存できたのですが・・・

  • ダウンロードninjaの画像について

    ダウンロードninjaをネット画像の収集に愛用しています。 2,3日前から設定を触ってないのにダウンロードした画像の種類がbitmapで保存されるようになってしまいました。それまではJPEGだったのですが・・・・。JPEGで保存したいのですが、マニュアルを読んでも設定の仕方がわかりません。ダウンロードする画像自体はJPEGです。JPEGで保存する方法と、BitmapをninjaでJPEGに変換する方法があったら教えてください。

  • Web上の画像の保存形式について

    最近、PCを買い換えました。以前使っていたPCではjpegで保存できたのと同様のWeb上の画像を保存しようとすると、jpegで保存したいのに、bitmapでしか保存することができません。設定上の問題があるのかと思うのですが、どう変更したらよいのかわかりません。どなたかご存知の方、教えていただけないでしょうか?使用しているOSはWindows XP、ブラウザはIE6.0です。よろしくお願いします。

  • 画像のアップロードができない

    PHPで携帯サイトを制作中なのですが、メールで画像をアップロードする ことができずに困っております。 具体的にはサーバーにファイル自体はアップロードされるのですが img配下を見ると「ev4rVY(エンコードされたファイル名)」がサーバーにアップされているものの、拡張子がついていないのです。 ▼画像アップロードプログラムPHPソース // ユーザー&認証コードチェック if ($user&&$auth_code==getAuthCode($user['id'], $user['auth_string'])) { // 認証OK // マルチパートの場合のみメールを解析して画像を取得 if (strtolower($structure->ctype_primary) == "multipart") { $images = getImage($structure->parts); } $image_save_path = null; // 画像リストの中から1つだけ画像を取得する foreach ($images as $image) { // コンテンツタイプのチェック if ($image['type'] == 'image/jpeg' || $image['type'] == 'image/gif' || $image['type'] == 'image/png') { // ファイルとして保存 // 一時ファイルパス $temp_path = tempnam('/tmp', 'img_'); if ($temp_path == false) { // error break; } $fp = fopen($temp_path, 'w'); if ($fp == false) { // error break; } fwrite($fp, $image['body']); fclose($fp); // 画像の形式と縦横サイズを取得 list($width, $height, $type) = getimagesize($temp_path); // 認識できる形式であれば、所定のメソッドで開く $imageSource = null; if ($type == IMAGETYPE_GIF) { $imageSource = imagecreatefromgif($temp_path); } else if ($type == IMAGETYPE_JPEG) { $imageSource = imagecreatefromjpeg($temp_path); } else if ($type == IMAGETYPE_PNG) { $imageSource = imagecreatefrompng($temp_path); } // 一時ファイルを消す unlink($temp_path); if ($imageSource) { // ファイル名決定 $path = tempnam($image_dir, ''); //unlink($path); $image_save_path = $path; // 画像をケータイディレクトリへファイル保存 imagejpeg($imageSource, $image_save_path); imagedestroy($imageSource); break; } } } ▲以上ここまで━━━━━━━━━━━━━━━━━━━━━━━━━ 開発環境:CentOS5 PHP Version 5.2.11 ※本を参考に制作しているのですが  本にはGD Graphics をダウンロードした方がよいと  記載がありました。関係ありますでしょうか。 どなたかお分かりになる方がいらっしゃいましたらどうか ご教授いただけませんでしょうか。 お願いいたします。

    • ベストアンサー
    • PHP
  • 8bit(256色)グレースケール画像の保存

    32bitのRGB画像ではなく、8bitのグレースケール画像を保存したいと考えています。 保存形式は、tiffとbmpのどちらでも構いません。 ですが、以下のような方法では、 アルファチャンネルを含んだ32bitのRGB画像が保存されてしまいます。 (作成中のプログラムの一例)    Dim img As Bitmap    Dim x As Integer    Dim y As Integer    img = New Bitmap(256, 50)    For x = 0 To 255       For y = 0 To 49          img.SetPixel(x, y, Color.FromArgb(x, x, x))       Next    Next    img.Save("gradation.tif", System.Drawing.Imaging.ImageFormat.Tiff) なお、一例として単純なグラデーション画像を保存していますが、 あくまでも一例であり、グラデーション画像を作成することが目的ではありません。 最終的には、VisualBasicのBitmapクラスで作成したbitmap画像を Photoshopで、8bitのグレースケール画像として開けることが理想です。 どうか、アドバイスをよろしくお願い致しますm(__)m

  • SQLiteで画像の格納

    Visual Studio 11でC#でWindows Applicationをつくろうと素人が奮闘しています。 SQLiteで画像(どの画像も6kb前後)を保存したいのですが、どうしてもわかりません。 下記のSQLiteのラッパークラスを使わせていただいて、テキストを保存したり削除したりすることはできるようになりました。 http://jikkenjo.net/391.html http://jikkenjo.net/567.html できれば上記のラッパークラスを活かす形でいきたいのですけども、教えていただけないでしょうか。 次のようにテーブルを作成し SQLiteConnector.Instance.ExecuteNonQuery("create table book(id integer primary key not null, title text, author text, image blob)"); 画像を保存するにはまずデータをバイナリ化するということで、 Image img = 縮小したりクリッピングしたりした画像データ; ImageConverter imgconv = new ImageConverter(); byte[] bi = (byte[])imgconv.ConvertTo(img, typeof(byte[])); とし、下記のようにInsertすればいけると思ったのですが SQLiteConnector.Instance.ExecuteNonQuery("insert into book(title, authorm image) values(?,?,?)", "book title", "book author", bi); 「渡された引数の型が処理できない形式です」とエラーが出てしまいます。 よろしくお願いいたします。

  • JavaでBitmapを圧縮しないでファイル保存

    javaで、android端末で実行する画像処理のアプリを作成しています。BitmapのデータをそのままBitmap形式でファイルに保存したいのですが、良い方法はありませんか。BitmapクラスをImageクラスまたはBufferedImageクラスに変換できれば、ImageIOを使って、ファイル書き込みや読み出しが簡単にできるのですが変換のやり方が分かりません。 Bitmapデータを圧縮して、Byte列に変換してからファイル書き込みを行う方法(bmp2dataなど)は、Webにいろいろ載っていますが、実行してみると時間がかかります。Bitmapを圧縮しないでそのままByte列に変換する方法があればよいのですが、探してみましたが見つかりません。どなたか良い方法をご存知でしたらお願いします。

  • VB.NETでのPictureBoxによる画像保存について

    またお世話になります。 VB.NETでプログラムでPictureBoxに絵を描かせているのですが、そこまでは表示させることができました。このできた画像をBitmapなりjpegなりに保存させて、ほかの画像ビューワ等でも見れる形にしたいのですがうまくいきません。 ちなみに今はこのように書いて、 Dim gra1 As Graphics = PictureBox1.CreateGraphics FileOpen(2, myfile2, OpenMode.Output) (絵を描かせるプログラム) PictureBox1.Image.Save(myfile2, System.Drawing.Imaging.ImageFormat.Bmp) FileClose(2) としてまわしたところ、 System.Runtime.InteropServices.ExternalException' のハンドルされていない例外が system.drawing.dll で発生しました。 追加情報 : GDI+ で一般的なエラーが発生しました。 といわれました。 どなたかご教授いただけたらお願いしますm(__)m

  • Bitmapのディスク容量

     以下、VBの記法で書きます。Windows10,.NETのGDI+を使用しています。  PixelFormat が Format32bppArgb のBitmapを作成し、描画処理が終わった後、Bitmap.Save(パス名)で保存します。  Bitmapは1250×1250(pixel)なので、そのディスク容量は、   1250×1250×4(byte)=6104 KB=6 MB くらいと思ってました。ところが保存してみると、60 KBくらい・・・。  読みだして表示するとちゃんと保存されてるので、これはこれであり難い事なのですが、どうして?、という質問です(^^;)。  PixelFormat が Format32bppArgb の場合は初期化時に、各pixelの(A,R,G,B) は (A,R,G,B)=(0,0,0,0)であり、例えばPictureBox の BackColor との兼ね合いで、(R,G,B)=(0,0,0)(黒)はDefaultで透過色になってるので、ディスク保存時には、pixel位置を表すIndex付きでpixel情報が圧縮されて保存されるのかしら?、などと想像したわけです。  たんに気になるので、どうなってるか知りたいだけです。ネットで検索してもBitmapの大きさは、画素数×4 byte という記事しか出てこないので・・・(^^;)。  関連する検索キーワードでも良いので、教えてもらえませんか。

専門家に質問してみよう