• 締切済み

VC#での24ビットbmp形式での保存方法

VC#でbmpファイルで保存する場合、以下のようにImageFormat.Bmpとすると思いますが、これだと32ビットbmp形式で出力されます。 24ビットbmpで出力する方法はないでしょうか? if (saveFileDialog1.ShowDialog() == DialogResult.OK) { pb1.Image.Save(saveFileDialog1.FileName,ImageFormat.Bmp); }

みんなの回答

noname#30727
noname#30727
回答No.2

C#の事は詳しくないですが、 画像編集用のBitmapのインスタンスを、PixelFormatを指定できるコンストラクタで作成し、読み込んだImageのインスタンスを書き込んでやればいいのでは。

  • jun2004
  • ベストアンサー率42% (24/57)
回答No.1

こんな感じでいかがでしょうか。 image/bmpが見つからなかった場合などのエラー処理は適宜実装してください。 ImageCodecInfo[] es =ImageCodecInfo.GetImageEncoders(); for(int i=0;i<es.Length;i++) { if(es[i].MimeType.Equals("image/bmp")) { EncoderParameters eparams = new EncoderParameters(1); eparams.Param[0] = new EncoderParameter(Encoder.ColorDepth, 24L); pictureBox1.Image.Save("24.bmp", es[i], eparams); } }

manky1225
質問者

補足

ありがとうございます。 動きましたが、やはり32ビットでした。 ペイントで開いて24ビットで保存しても、32ビットのままだし。 フリーソフトで24ビット保存すると、真っ黒になるし。 bmpをウェーブレット変換して、透かし文字を入れて、元に戻すという作業をやっています。単に画像を開いて、保存するだけだと、ImageFormat.BMPでも24ビットでした。透かしを入れると32ビットになるのですが、単にRGB値を変更してるだけなので、ビット数は変わりませんよね。

関連するQ&A

  • VC#でのファイル保存

    private void Save_File_Click(object sender, System.EventArgs e) { if (saveFileDialog1.ShowDialog() == DialogResult.OK) {pb2.Image.Save(saveFileDialog1.FileName,ImageFormat.Jpeg);} } ↑のようにすると、「型または名前空間名 'ImageFormat' が見つかりませんでした。ディレクティブを使うかアセンブリ参照を使ってください。」とエラーがでます。 テキストを真似てプログラムしたのですが・・・ pb2はpictureBox2です(PictureBox pb2;pb2=pictureBox2;) よろしくお願いします。

  • VC#で品質を指定してJpeg保存する方法

    pictureBox1に開かれている画像をJpegで保存する場合、以下のようにすると本に書いてありましたので、試してみたところ画質が悪かったです。 private void menuItem1_Click(object sender, System.EventArgs e) { if (saveFileDialog1.ShowDialog() == DialogResult.OK) { pictureBox1.Image.Save(saveFileDialog1.FileName,ImageFormat.Jpeg); } } 検索したところ、Jpegの場合、品質を指定することができるようですが(http://dobon.net/vb/dotnet/graphics/encoderparameters.html)、このサイトのは微妙に違うのでよくわかりません。 pictureBox1に開かれている画像をファイル名を指定して、Jpeg保存する方法を教えて下さい。よろしくお願いします。

  • VC++フォームアプリケーション でのビットマップ処理

    私は今Visual Studio 2005(C++)のフォームアプリケーションでプログラムを組んでいるのですが、ビットマップ処理ができません。以下のプログラムにどのような変更を加えればできるようになるのでしょうか? ご存知の方がいたら教えてください。 #pragma once ~フォームのデザイン部分のプログラム(自動)なので省略いたします~ #pragma endregion private: Bitmap^ bmp; private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { } private: System::Void 開くOToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { OpenFileDialog^ myDLG = gcnew OpenFileDialog(); myDLG->AddExtension = true; myDLG->DefaultExt = "bmp"; myDLG->FileName = "*.bmp"; myDLG->ShowReadOnly = false; myDLG->Filter = "ビットマップ(*.bmp) | *.bmp | jpeg(*.jpg;*.jpeg) | *.jpg;*.jpeg"; if(myDLG->ShowDialog() == System::Windows::Forms::DialogResult::OK){ this->Text = myDLG->FileName; pictureBox1->Image = gcnew Bitmap(myDLG->FileName); Invalidate(); } } private: System::Void 保存SToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { SaveFileDialog^ myDLG = gcnew SaveFileDialog(); myDLG->AddExtension = true; myDLG->DefaultExt = "bmp"; myDLG->FileName = "*.bmp"; myDLG->Filter = "ビットマップ(*.bmp) | *.bmp | jpeg(*.jpg;*.jpeg) | *.jpg;*.jpeg | すべてのファイル(*.*) | *.*"; if(myDLG->ShowDialog() != System::Windows::Forms::DialogResult::OK){ return; } pictureBox1->Image->Save(myDLG->FileName); Invalidate(); } private: System::Void 閉じるCToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { if(MessageBox::Show("アプリケーションを終了しますか?","画像描画",MessageBoxButtons::OKCancel,MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::OK){ this->Close(); } } private: System::Void 編集ToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { } private: System::Void 回転180ToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { } } よろしくお願いします。

  • Visual Studio 2005でWindowsフォームのプログラミングについて

    「Visual Studio 2005」のC++でWindowsフォームのプログラミングをしているのですが、画像保存ができなくて困ってます。 「開く」はどうにか参考書を見ながらできましたが、「保存」ができません。以下がプログラムとなっております。 private: System::Void 開くOToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {  OpenFileDialog^ myDLG = gcnew OpenFileDialog();  myDLG->AddExtension = true;  myDLG->DefaultExt = "bmp";  myDLG->FileName = "*.bmp";  myDLG->ShowReadOnly = false;  myDLG->Filter = "ビットマップ(*.bmp) | *.bmp | jpeg(*.jpg;*.jpeg) | *.jpg;*.jpeg";  if(myDLG->ShowDialog()==System::Windows::Forms::DialogResult::OK){    this->Text = myDLG->FileName;    pictureBox1->Image = gcnew Bitmap(myDLG->FileName);    Invalidate();  } } private: System::Void 保存SToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {  SaveFileDialog^ dlg = gcnew SaveFileDialog();  dlg->Filter = "ビットマップ(*.bmp) | *.bmp | jpeg(*.jpg;*.jpeg) | *.jpg;*.jpeg | すべてのファイル(*.*) | *.*";  if(dlg->ShowDialog() != System::Windows::Forms::DialogResult::OK){    return;  } /*** ここからわかりません。 ***/ } 知ってる方がいましたら教えてください。よろしくお願いします。

  • OpenCVで出力を24bitのbmpにするには?

    OpenCVを使って画像処理(ラべリングなど)をしたのですが、出力を24bitのbmp形式の画像で出力させたいです。 ビット深度?(8bitのbmp形式から24bitのbmp形式)を変更させることはできますか? 自分でいろいろ調べたのですが、いまいち分からなくて困っています。 もしわかる方がいらっしゃれば是非教えてください。 OpenCV2.4.6,VisualC++2010を用いています。 入力画像は白黒画像で、24bitのbmp形式の画像です。 ですが、OpenCVで画像処理させると8bitのbmp画像として出力されます。(ラべリングなどの処理をした後の画像) 他のプログラムで24bitのbmp形式で処理させているため8bitのbmp形式の画像を24bitのbmp画像に変更させたいのですが、変更する方法がわかる方がいればぜひ教えてください。 私自身、プログラムは大学の授業レベル、OpenCVは使い始めて数ヶ月なので詳しくないです。 よろしくお願いします。

  • C#の保存フォーマット指定

    C♯のプログラムで 保存、読み込みにおいてbmp以外にjpgとgifを指定しないといけないのですが、 >saveFileDialog1.Filter =のあとの“イメージ(*.bmp)…には追加したのですが、 >そのあとの System.Drawing.Imaging.ImageFormat.Bmp: の部分を変えないといけないのですが、そこが分からなくて詰まっています! 誰か教えてください! お願いします

  • C#でのcsv保存

    今,下記のようなプログラムを組んでいます.ですが,うまくdataGridviewのデータが保存されません.何がいけないのでしょうか?だれかご教授よろしくお願いいたします. int R,C; R = dataGridView1.RowCount - 1; C = dataGridView1.ColumnCount - 1; string[] cdata = new string[R]; //string Ter =Convert.ToString(R); //string Tec = Convert.ToString(C); //textBox1.Text = Ter; //textBox2.Text = Tec; for (int Gdata = 1; Gdata < R; Gdata++) { string c = Convert.ToString(dataGridView1.Rows[Gdata].Cells[0].Value); cdata[Gdata] = c; //saveFileDialog1.Filter = "csvファイル (*.csv)|*.csv"; //if (saveFileDialog1.ShowDialog() == DialogResult.OK) //{ // int cdata = Convert.ToInt16(c); // cdata.saveNewCSVdata(saveFileDialog1.FileName); //} } //SaveFileDialogクラスのインスタンスを作成 SaveFileDialog sfd = new SaveFileDialog(); //ダイアログを表示する if (sfd.ShowDialog() == DialogResult.OK) { //OKボタンがクリックされたとき //選択された名前で新しいファイルを作成し、 //読み書きアクセス許可でそのファイルを開く //既存のファイルが選択されたときはデータが消える恐れあり System.IO.Stream stream; stream = sfd.OpenFile(); if (stream != null) { //ファイルに書き込む System.IO.StreamWriter sw = new System.IO.StreamWriter(stream); sw.Write(cdata); //閉じる sw.Close(); stream.Close(); } }

  • C#でテキストをutf-8(BOM無し)保存したい

    C#で「名前を付けて保存」ダイアログでテキストを保存する際に、エンコードをutf-8のBOM無し形式で保存したいです。 今は、ただsaveFileDialogでそのまま保存しているだけですが、保存する際にエンコードをutf-8のBOM無しにするプログラムをご教授ください。 今は以下のようなプログラムを書いています。こちらでどのように追加すれば良いのかを教えてください。 //[名前を付けて保存]ダイアログをボックスを表示する saveFileDialog1.Filter = "UWSCファイル(*.uws)|*.uws"; //[ファイルの種類]ボックスの拡張子を設定。 saveFileDialog1.Filter = "DOTファイル(*.dot)|*.dot"; //[ファイルの種類]ボックスの拡張子を設定。 if (saveFileDialog1.ShowDialog() == DialogResult.OK) //ダイアログのOKがクリックされた場合は、 { System.IO.File.WriteAllText(saveFileDialog1.FileName, txtBox_ResultUWSC.Text, Encoding.Default); //txtBox_ResultUWSCの全テキスト内容を保存する。 } 以上、よろしくおねがいいたします。

  • 【C#】ラバーバンドでのドラッグ矩形範囲の画像切抜

    現在C#にて画像を表示してラバーバンドで選択した範囲のみを切り抜いて画像ファイルとして保存する。 というツールを製作しているのですが、ラバーバンドの表示やピクチャボックス全体の画像ファイルの保存はできたのですが選択範囲のみを切り抜いて保存すると言う処理が私にはかけません。。 どなたか助けてはいただけないでしょうか? public partial class Form1 : Form { private int _xi, _yi, _xc, _yc; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //OpenFileDialogクラスのインスタンスを作成 OpenFileDialog ofd = new OpenFileDialog(); //はじめのファイル名を指定する ofd.FileName = ""; //はじめに表示されるフォルダを指定する ofd.InitialDirectory = @"C:\"; //[ファイルの種類]に表示される選択肢を指定する ofd.Filter = "TIFFファイル(*.tif;*.tiff)|*.tif;*.tiff|JPEGファイル(*.jpg;*.jpeg)|*.jpg;*.jpeg|PNGファイル(*.png)|*.png|ビットマップ(*.bmp)|*.bmp|すべてのファイル(*.*)|*.*"; //[ファイルの種類]ではじめに //「TIFFファイル」が選択されているようにする ofd.FilterIndex = 1; //タイトルを設定する ofd.Title = "開くファイルを選択してください"; //ダイアログボックスを閉じる前に現在のディレクトリを復元するようにする ofd.RestoreDirectory = true; //ダイアログを表示する if (ofd.ShowDialog() == DialogResult.OK) { //OKボタンがクリックされたとき //画像の大きさをPictureBoxに合わせる pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; //PictureBox1に選択した画像を表示する pictureBox1.ImageLocation = ofd.FileName; } } private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { if (e.Button != MouseButtons.Left) return; _xi = _xc = e.X; _yi = _yc = e.Y; pictureBox1.Invalidate(); } private void pictureBox1_MouseMove(object sender, MouseEventArgs e) { if (e.Button != MouseButtons.Left) return; _xc = e.X; _yc = e.Y; pictureBox1.Invalidate(); } private void pictureBox1_Paint(object sender, PaintEventArgs e) { if(_xc == _xi && _yc == _yi) return; int x, y, w, h; if(_xc < _xi) { x = _xc; w = _xi - _xc; } else { x = _xi; w = _xc - _xi; } if(_yc < _yi) { y = _yc; h = _yi - _yc; } else { y = _yi; h = _yc - _yi; } e.Graphics.DrawRectangle(Pens.Black, x, y, w, h); } private void button2_Click(object sender, EventArgs e) { //SaveFileDialogクラスのインスタンスを作成 SaveFileDialog sfd = new SaveFileDialog(); // フィルターの設定 sfd.Filter = "TIFF形式|*.tif|GIF形式|*.gif|JPEG形式|*.jpeg|PNG形式|*.png|すべてのファイル(*.*)|*.*"; // ファイル保存ダイアログを表示 sfd.ShowDialog(); String extension = System.IO.Path.GetExtension(sfd.FileName); switch (extension.ToUpper()) { case ".TIF": // PictureBoxのイメージをTIFF形式で保存する pictureBox1.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Tiff); break; case ".GIF": // PictureBoxのイメージをGIF形式で保存する pictureBox1.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Gif); break; case ".JPEG": // PictureBoxのイメージをJPEG形式で保存する pictureBox1.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Jpeg); break; case ".PNG": // PictureBoxのイメージをGIF形式で保存する pictureBox1.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Png); break; } }

  • VB 単純ミス? 画像保存に関して

    お世話になります 単純ミスだとは覆うのですが、単純すぎるせいか、理解できない状況に陥ってしまいました。 コンパイルをするとImage.Saveの行で構文エラーが発生、 もしやと思い括弧を外すと今度は変数が・・・・ どこがいけないのか、ご指摘をお願いいたします Dim FileName As String FileName = App.Path & "\TmpDummy.jpeg" Me.Picture.Image.Save(FileName, Imaging.ImageFormat.Jpeg) ← 「構文エラー」 Me.Picture.Image.Save FileName, Imaging.ImageFormat.Jpeg ← Imagingに対して「変数が定義されてません。」

専門家に質問してみよう