VC++のMFC、ダイアログベースで画像処理のソフトを開発している者です。
ピクチャーコントロールに画像を表示させて、その画像を保存したいと思っています。
保存用のダイアログを開き、名前を付けて保存したいのですがうまくいきません。
下が今作っているプログラムです。
void Cstart2Dlg::OnBnClickedButton10()
{
CFileDialog myDLG(FALSE,"BMP","*.BMP",
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"画像(*.BMP)|*.BMP||");
if(myDLG.DoModal() == IDOK){
CStdioFile fout(myDLG.GetPathName(),CFile::modeCreate
|CFile::modeWrite|CFile::typeBinary);
UpdateData(TRUE);
fout.WriteString(m_pict8);
fout.WriteString("\xla");
filename = myDLG.GetPathName();
SetWindowText("start2"+filename);
}
ピクチャーコントロールの変数をm_pict8にしています。テキストファイルを保存するプログラムを参考にして作っているので間違っているのだと思います。
画像の保存方法が分かる方がいらっしゃいましたらよろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
こんにちは。
ビットマップファイルの場合、セーブする為の手順は
BITMAPFILEHEADER → BITMAPINFOHEADER → RGBQUADテーブル → イメージデータ
と言った具合です。RGBQUADテーブル(パレットテーブル)は、何ビットイメージでセーブするかによって、テーブル長が変化します。
さて、何ビットイメージでセーブをお望みでしょうか。
No.2
- 回答日時:
こんばんは。
補足頂きました。24bitフォーマットならば、特に難しい事は有りません。
イメージ全体のサイズが4の倍数に満たない場合、ダミーバイトを付け加えてサイズの調整しないといけません。此れを怠ると、別のソフトで開いた時にほぼ間違いなく可笑しくなります。
また、パレットイメージを所有していない為、RGBQUADテーブル(パレットテーブル)の作成も必要有りません。
改善の余地もあるとは思いますが、以下参考程度に。
//1スキャンライン辺りの4バイト調整をした数字を求める
static LONG CalcScanLineByte(const LONG w, const WORD bpp)
{
return (((bpp * w) + 31) / 32) * 4;
}
+---------------------------------------------------------------------------------------
セーブする時
//ファイルを開く
CStdioFile fout(myDLG.GetPathName(),CFile::modeCreate | CFile::modeWrite|CFile::typeBinary);
//ピクチャボックスからビットマップを取り出す
HBITMAP hBitmap = m_pict8.GetBitmap();
//無いので処理できない
if(hBitmap == NULL)return;
//ビットマップの情報を取る
BITMAP bitmap = {0};
::GetObject(hBitmap, sizeof(bitmap), &bitmap);
//4バイト調整したスキャンラインのサイズ
const int iScanLineByte = ::CalcScanLineByte(bitmap.bmWidth, bitmap.bmBitsPixel);
//ファイルヘッダとビットマップヘッダ
BITMAPFILEHEADER bmfh = {sizeof(bmfh)};
BITMAPINFOHEADER bmif = {sizeof(bmif)};
//ビットマップである事を示す名称
bmfh.bfType = ('M' << 8) | 'B';
//イメージデータへのオフセットはファイルヘッダ+ビットマップヘッダ
bmfh.bfOffBits = sizeof(bmfh) + sizeof(bmif);
//見ての通り
bmif.biBitCount = 24;
//24ビットの時はBI_RGBで固定
bmif.biCompression = BI_RGB;
//常に1で固定
bmif.biPlanes = 1;
//見ての通り
bmif.biWidth = bitmap.bmWidth;
bmif.biHeight= bitmap.bmHeight;
//4バイト調整も含めた正確な合計バイトサイズが必要
bmif.biSizeImage = iScanLineByte * bmif.biHeight;
//ファイルヘッダ→ビットマップヘッダの順番に書き出す
fout.Write(&bmfh, sizeof(bmfh));
fout.Write(&bmif, sizeof(bmif));
//イメージデータをセーブする
HDC hMemDC = ::CreateCompatibleDC(NULL);
::SelectObject(hMemDC, hBitmap);
//yを縦幅-1から回転させないと上下逆転してしまう
for(int y = bmif.biHeight - 1; y >= 0; --y)
{
//3バイトずつステップする
for(int x = 0; x < iScanLineByte; x += 3)
{
const COLORREF cref = ::GetPixel(hMemDC, x / 3, y);
//色素の位置関係をBGRにしないと赤と青の関係が逆転してしまう
const BYTE arrBy[3] = {GetBValue(cref), GetGValue(cref), GetRValue(cref)};
//1ピクセル分(3バイト)書き出す
fout.Write(arrBy, sizeof(arrBy));
}
}
::DeleteDC(hMemDC);
この回答への補足
2度もご回答本当にありがとうございます。もう少しでうまくいきそうなのですが、
CFileDialog myDLG(FALSE,"BMP","*.BMP",
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"画像(*.BMP)|*.BMP||");
の部分に、「2 番目の引数を 'const char [4]' から 'LPCTSTR' に変換できません。」というエラーが出てしまいす。どうしたら解決できるのか、ご指導お願いいたします。
先ほどの問題はなんとか解決することができました。
またまたお手数なのですが、32ビットの保存方法も教えていただけないでしょうか。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/21 13:29
- Excel(エクセル) EXCELマクロでandroidタブレットから取りんだJPEGファイルをうまくセルに貼り付けられない 2 2022/07/31 15:03
- ノートパソコン PCのshift+右クリックについて 2 2022/08/22 08:52
- その他(ソフトウェア) コマンドプロンプトについて教えてください。 状況: 画像編集ソフト上でネットから保存した画像を使うの 3 2022/05/26 11:14
- 教えて!goo 「教えて!goo」や「Yahoo知恵袋」に投稿する際の画像についてお聞きします。 2 2023/05/23 12:53
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- その他(プログラミング・Web制作) ホームページビルダー16で画像を保存したら画像がトップページ上に沢山出てきてしまいます 1 2022/12/06 14:50
- Visual Basic(VBA) Excelのマクロコードについて教えてください 1 2022/03/27 12:02
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】NEW演歌
【大喜利】 若い人に向けたことは分かるけど、それはちょっと寄せ過ぎて変になってないか?と思った演歌の歌詞
-
【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
2024年は「名探偵コナン30周年」「涼宮ハルヒ20周年」などを迎えますが、 あなたが「もうそんなに!?」と驚いた○○周年を教えてください。
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
おすすめのモーニング・朝食メニューを教えて!
コメダ珈琲店のモーニング ロイヤルホストのモーニング 牛丼チェーン店の朝食などなど、おいしいモーニング・朝食メニューがたくさんありますよね。
-
ハマっている「お菓子」を教えて!
この世には、おいしいお菓子がありすぎて……。 次何を食べたらいいか迷っています。 みなさんが今、ハマっている「お菓子」を教えてください!
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
MFC - ダイアログボックスのPictureControlへの画像表示
C言語・C++・C#
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
-
4
デバイスコンテキストに書いた絵をBMPファイルに落としたいです。
C言語・C++・C#
-
5
MFCで画像を表示させているのですが、透過表示する方法がわかりません。
C言語・C++・C#
-
6
VC++プログラムをつかったBMP画像の拡大縮小について
C言語・C++・C#
-
7
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
8
リソースエディタでスタティックテキストの文字サイズの変更
C言語・C++・C#
-
9
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
10
CFileDialogで保存したい
C言語・C++・C#
-
11
CStringの文字列検索&抜き出しについて
C言語・C++・C#
-
12
起動後直に実行するコードはどこに?
C言語・C++・C#
-
13
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
14
CString型 全角半角を意識せずに「1文字」ずつ取り出す
C言語・C++・C#
-
15
MFCのタイマーのつかい方を教えてください
C言語・C++・C#
-
16
VC++6.0 エディットボックス小数点表示
C言語・C++・C#
-
17
リストコントロールのデータの変更を検知したい
C言語・C++・C#
-
18
MFCでOnPaintのタイミング
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
EOF
-
エンディアンと2の補数表現
-
RandomAccessFile文字列の上書き
-
エラー:ストリームの終わりを...
-
プログラミング初心者です。プ...
-
MIMEとバイナリデータの読み方
-
JavaScriptの実行速度が遅い
-
ページ読み込み時に自動的にsub...
-
FMFファイルの構造を知りたいの...
-
バイナリファイルの検索について
-
C言語初心者の質問失礼します。
-
フルパスから最後のディレクト...
-
どんなプログラムを書いても指...
-
絶対パスの絶対て英語で何でし...
-
アクセスカウンターが更新され...
-
VBに、Cのincludeのようなもの...
-
fopenできる上限の変更
-
OLE又はDDEを使うVISUAL BESIC...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
EXCEL VBAでテキストファイルの...
-
エクセルVBA 2千万行のCSVファ...
-
Microsoft VBAで2GBを超えるフ...
-
EOF
-
入力ファイルをバイナリにする利点
-
VBA バイナリ―から文字列にす...
-
エラー:ストリームの終わりを...
-
【MFC】CFileでSeekした位置か...
-
ページ読み込み時に自動的にsub...
-
MacからWinにファイルを添付す...
-
24ビットのWaveデータの中身に...
-
FTPでエクセルをPUTするとファ...
-
【python】Excelファイルを読み...
-
EXCEL VBAで、バイナリデータの...
-
バイナリーデータの一部データ...
-
バイナリファイルの比較につい...
-
PHPのfgetcsvの処理容量について
-
ビットマップファイル生成(C言...
-
FMFファイルの構造を知りたいの...
おすすめ情報