• 締切済み

Bitmapの「biBitCount」の変更について

ビットマップファイルのヘッダにある 「biBitCount(1 画素あたりのデータサイズ (bit))」 についてですが、 「24 - 1677万色(true color)ビットマップ」のファイルを 「1 - 2 色ビットマップ」 に変更する関数などはないでしょうか? GDI+等に関数がありそうだと思ったのですが見つからず・・・。 もしご存知の方がおられたらご教授お願いいたします。

  • ya-cha
  • お礼率68% (184/268)

みんなの回答

  • fioletti
  • ベストアンサー率0% (0/2)
回答No.2

すみません。さきほどの回答はすこし勘違いしていて、メモリ上に読み込んだイメージのGDI的な変換方法を書いてしまいました。 ご質問をよく読むとファイル→ファイルのようなので、いろいろやり方はあると思うのですが、私の場合IPictureで処理します。 イメージがはっきりとはなかったので、そして現在UNIX環境から書き込んでいるのでヘッダとかが見られず、ググりながら流れを考えました。不正確でしたら申し訳ないです。 1.OleCreatePictureIndirect で単色ビットマップをもつIPicture実装オブジェクトを作る。 2.OLELoadPictureでカラーのIPicture実装オブジェクトを作る。 3.単色のIPictureのget_CurDCで取得したDCに対して、カラーのIPictureのRenderでイメージを転送(このときに変換が起こる)。 4.単色のIPictureのSaveAsFileを呼んでファイルに保存する。 IPictureの定義は下記URLにありました。(ヘッダがあるならそれを見た方が早いです) 何年か前ならググると情報も豊富にありMSDNにも普通に定義があったのですが現在はかなり探しにくくなっているようです。

参考URL:
http://www.com.it-berater.org/COM/controls_and_property_pages/interfaces/IPicture.htm
  • fioletti
  • ベストアンサー率0% (0/2)
回答No.1

もう何年もやってないので間違っていたら申し訳ないのですが、 GDIのCreateBitmapで作ったビットマップをSelectObjectして、 HDCに対してBitbltしてやるのだと思います。

参考URL:
http://yokohama.cool.ne.jp/chokuto/urawaza/api/CreateBitmap.html
ya-cha
質問者

補足

ご回答ありがとうございます。 上記手順のどのタイミングでモノクロ画像に変更出来るのでしょうか? お手数ですがお願いいたしますm(__)m

関連するQ&A

  • CBitmapか何かでbitmapの色を変更したい

    VisualStudio2008を使用しています。 例えば15x15の四角のビットマップ(■)を任意の色に変更させるプログラムを作ろうと思っていますが、 CBitmapを使えばできると思ったのですが、なかなかうまくいきません。 イメージとしてはGDI(0,0,0)をGDI(0,0.255)に変更するという関数があるのかなと思ったのですが、 MFCサイトを見てもなさそう?でした。(よくわかりませんでした) ↓こんな感じに書きましたが、うまく動きませんでした。 CBitmap iconBitmap; COLORREF cr_from = RGB(0,0,0); COLORREF cr_to = RGB(0,0,255); COLORMAP COLORMAP; COLORMAP.from = cr_from; COLORMAP.to = cr_to; iconBitmap.LoadMappedBitmap(IDB_CELLCOLOR,1,&COLORMAP,1); 最後の行で異常終了します。 簡単にできる方法はありませんでしょうか? ご教授お願いいたします。

  • Win32でのBITMAP

    BITMAPをバイナリデータから作成しています。BITMAPINFO構造体のbiBitcountからカラーテーブルの色を調べようと思ったんですが8Bit(256色)で表示されるBITMAPの場合、カラーテーブルのデータは、 for(; l < (1 << bmpInfo.bmiHeader.biBitCount); l++) { printf("bmpInfo.bmiColors[%d].rgbBlue = %d\n",l,bmpInfo.bmiColors[l].rgbBlue); printf("bmpInfo.bmiColors[%d].rgbGreen = %d\n",l,bmpInfo.bmiColors[l].rgbGreen); printf("bmpInfo.bmiColors[%d].rgbRed = %d\n",l,bmpInfo.bmiColors[l].rgbRed); }    で表示しているのですがこの方法で正しいのでしょうか? あと、4bitの場合、16色となり、1バイト=2ピクセルとなり、上記とはまた違ったやり方でないとダメなんでしょうか?

  • ピクセル数から画像サイズ推測

    こんにちわ。 縦横のピクセル数から、その範囲を画像化したときの 大まかなサイズが知りたいのですが、なにかよい方法はないでしょうか。 #フォーマットはいろいろ選択できる形です。 BMPとかですと ファイルヘッダサイズ+画素数*深さ+カラーマップサイズ(適当)+α くらいの計算式で大まかなサイズが出ると思うのですが 圧縮系画像とかでも使いまわせるような式がありましたら教えていただけますでしょうか。 あくまで大体で、入力値は画素数(縦横)・色深さぐらいの情報です。 宜しくお願いいたします。

  • bitmap画像の保存がうまくいきません。

    VC++のMFC、ダイアログベースで画像処理のソフトを作っています。 処理した画像を保存したいのですが、「描画できませんでした」というメッセージのでるファイルになってしまい、うまく保存できません。 プログラムは以下のようになっていてピクチャーコントロールの変数をm_pict8にしています。また、画像は24ビットで240×320のものを保存します。 static LONG CalcScanLineByte(const LONG w, const WORD bpp) { return (((bpp * w) + 31) / 32) * 4; } //----------------------------------------------------------- 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); //ピクチャボックスからビットマップを取り出す HBITMAP hBitmap = m_pict8.GetBitmap(); //無いので処理できない if(hBitmap == NULL)return; //ビットマップの情報を取る BITMAP bitmap = {0}; ::GetObject(hBitmap, sizeof(bitmap), &bitmap); //4バイト調整したスキャンラインのサイズ const int iScanLineByte = ::CalcScanLineByte(240, bitmap.bmBitsPixel); //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 = 240; bmif.biHeight= 320; //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); } どこか改善点などありましたら、よろしくお願いいたします。

  • TIFFを開いてBITMAPで保存する方法

    ■開発環境 VC++6.0,Windows2000 Pro,+ libtiff(TIFFを扱うライブラリ) で以下のようなコードを書きました. ************************************************* BOOL CTiff::OpenTiffAndSaveBMP(CString path) { HDIB hDIB; hDIB = LoadTIFFinDIB(path); BITMAPFILEHEADER BMPFILEHEADER; LPBITMAPINFOHEADER BMPINFOHEADER; if(!hDIB) return FALSE; CFile file; path.Replace("tif", "bmp"); if( !file.Open( path, CFile::modeWrite|CFile::modeCreate) ) return FALSE; BMPINFOHEADER = (LPBITMAPINFOHEADER)hDIB; int nColors = 1 << BMPINFOHEADER->biBitCount; // BITMAPFILEHEADERのフィールドを初期化 BMPFILEHEADER.bfType = ((WORD) ('M' << 8) | 'B'); // is always "BM" BMPFILEHEADER.bfSize = GlobalSize (hDIB) + sizeof( BMPFILEHEADER ); BMPFILEHEADER.bfReserved1 = 0; BMPFILEHEADER.bfReserved2 = 0; BMPFILEHEADER.bfOffBits = (DWORD)(sizeof( BMPFILEHEADER ) + BMPINFOHEADER-> biSize + nColors * sizeof(RGBQUAD)); // ファイルヘッダを書き込む file.Write( &BMPFILEHEADER, sizeof(BMPFILEHEADER) ); // DIBのヘッダとビット列を書き込む DWORD nSize = GlobalSize(hDIB); file.Write( BMPINFOHEADER, nSize ); file.Close(); return TRUE; } ************************************************ しかし,OpenTiffAndSaveBMP()の下から3行目の >file.Write( BMPINFOHEADER, nSize ); でDebug Assertion Failed!なるエラーで止まってしまいます. そこで「無視」ボタンを押すと「ファイルにアクセス中に不明なエラーが発生しまし た」となります. 文字数の制限上LoadTIFFinDIB()のソースは無いのですが, 原因ならびに解決策の分かる方ご教授ください.

  • jpegファイルのサイズ変更について

    jpegファイルを直接、拡大したり縮小したりする方法ってありますか? 今、私は一度ビットマップファイルに変換してからサイズを変えて、またjpeg ファイルに戻してます。また、簡単にサイズ変更できるフリーソフトなどありますか?

  • Photoshopのビット数について

    現在Photoshopを使っていて、絵を描いています。 カラーを8bitと16bitの二つから選択ができるのですが、 どちらにしようか迷っています。 できたら色数の多い16bitの方が良いのでしょうけれど、 ファイルサイズが大きくなってしまいますよね? 私の描いている絵は写真に比べたら、それほど色の幅があるものではありません。 なので8bitでもいいのかなぁと思ったりもするのですが、どうでしょうか? それほど8bitと16bitの差は大きいものでしょうか? お願いします。

  • ビットマップの色数を変更するソフト知りませんか?

    色の深さが24(1677万色)のビットマップを深さ8(256色)に変更したいと思っております。 Windowsのペイントでも出来ることは知っておりますが、もっと簡単だったり、高機能なフリーソフト等が ございましたら教えてくださいm(__)m ちなみに変換したいファイルが多いので簡単なソフトを探しております。

  • EXCELのセルの色が勝手に変更されてしまう

    XP-HOMEで、EXCEL2002を使っています。 ある行のカラーをツールバーを使って無色からブルーに変更しました。 すると、2行下からセルに数値を入力するだけで、セルのカラーがブルーに変更されるようになってしまいました。この現象が起きるのはこのファイルを開いているときだけで、他のファイルで同様の処理をしても、勝手にセルの色が変更されることはありません。 どのような原因が考えられるでしょうか?どなたかご教授お願いいたします。

  • デジカメで撮った写真の画素数を変更したいのですが

    デジカメで撮った写真の画素数が大きくて、メールで送るのが大変です そこでデジカメ写真のファイルから画素数を縮小して送りたいのですが 写真サイズ(画素数)を変更する方法が分かりません どなたか教えてください

専門家に質問してみよう