- ベストアンサー
画像の白黒表示
Visual C++6.0でjpgなどのカラーの画像を白黒にして 保存したいのですが、どうすればよいでしょうか? 日本語プログラミング言語「なでしこ」でソースを 組んでみたのですが、やはりインタプリタなので 速いとは言えず290x350の画像で30分程度かかってしまいます。 なでしこでは 画像を表示してその表示されている色を取得して RGBの形式にし、それを下のURLを参考に (r*30 + g*59 + b*11)/100しています。 VCでjpgなどを処理するにはどうすればよいでしょうか? http://www.ne.jp/asahi/nagoya/ahomaro/builder/cpb-039.html
- knoppixer
- お礼率55% (88/159)
- C・C++・C#
- 回答数2
- ありがとう数0
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
GDI+を利用すると、比較的簡単にJPEGファイルの読み書きができます。 使い方については以下のサイト等を参照して下さい。 http://lamoo.s53.xrea.com/develop/gdiplus/gdiplus.html http://www.kumei.ne.jp/c_lang/sdk4/sdk_335.htm なおGDI+にはセキュリティ問題があるので、アプリを配布する際はその辺りに配慮する必要があります。 画像ファイルを読み込み、グレースケール画像をJPEGファイルに保存するサンプルは以下のような感じです。 動作確認はVC++.NET 2003(MFC7.1)で行いました。 //-------------------------------------------------- void Convert() { // GDI+の初期化 ULONG_PTR gdiplusToken; GdiplusStartupInput gdiplusStartupInput; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); CBitmap* pBmp = LoadImage(L"d:\\test.jpg"); if (pBmp) { BITMAP sBitmap; pBmp->GetBitmap(&sBitmap); DWORD dwSize = (DWORD)(sBitmap.bmWidthBytes * sBitmap.bmHeight); BYTE* pBuffer = new BYTE[dwSize]; pBmp->GetBitmapBits(dwSize, pBuffer); int nOffset = 0; int nVal = 0; for (int j = 0; j < sBitmap.bmHeight; j++) { for (int i = 0;i < sBitmap.bmWidth; i++) { // pBuffer[nOffset]:青、pBuffer[nOffset + 1]:緑、pBuffer[nOffset + 2]:赤 nVal = (pBuffer[nOffset] * 11 + pBuffer[nOffset + 1] * 59 + pBuffer[nOffset + 2] * 30) / 100; pBuffer[nOffset + 0] = (BYTE)nVal; pBuffer[nOffset + 1] = (BYTE)nVal; pBuffer[nOffset + 2] = (BYTE)nVal; nOffset += 4; // 32bitカラーは1ピクセル=4バイト } nOffset = j * sBitmap.bmWidthBytes; } pBmp->SetBitmapBits(dwSize, pBuffer); SaveJpegImage(L"d:\\test-gr.jpg", *pBmp, 80); delete pBuffer; delete pBmp; } // GDI+の解放 GdiplusShutdown(gdiplusToken); } //-------------------------------------------------- CBitmap* LoadImage(const WCHAR* szFileName) { if (!szFileName) return NULL; CBitmap* pBitmap = NULL; Bitmap* pGdiBitmap = Bitmap::FromFile(szFileName); if (pGdiBitmap->GetLastStatus() == Ok) { HBITMAP hBitmap = NULL; if (pGdiBitmap->GetHBITMAP(Color(0,0,0), &hBitmap) == Ok) { pBitmap = new CBitmap(); pBitmap->Attach(hBitmap); } } return pBitmap; } //-------------------------------------------------- BOOL SaveJpegImage(const WCHAR* szFileName, const CBitmap& bmp, const int nQuality) { if (!szFileName) return FALSE; // CLSIDの取得 CLSID clsid; GetEncoderClsid(L"image/jpeg", &clsid); // 品質指定 EncoderParameters encoderParams; encoderParams.Parameter[0].Guid = EncoderQuality; encoderParams.Parameter[0].NumberOfValues = 1; encoderParams.Parameter[0].Type = EncoderParameterValueTypeLong; encoderParams.Parameter[0].Value = (VOID*)&nQuality; encoderParams.Count = 1; Bitmap gdiBmp(bmp, NULL); if (gdiBmp.Save(szFileName, &clsid, &encoderParams) != Gdiplus::Ok) return FALSE; return TRUE; } //-------------------------------------------------- int GetEncoderClsid(const WCHAR* szFormat, CLSID* pClsid) { UINT nNum = 0; UINT nSize = 0; ImageCodecInfo* pImageCodecInfo = NULL; GetImageEncodersSize(&nNum, &nSize); if (nSize == 0) return -1; pImageCodecInfo = (ImageCodecInfo*)(malloc(nSize)); if (!pImageCodecInfo) return -1; GetImageEncoders(nNum, nSize, pImageCodecInfo); for (UINT i = 0; i < nNum; ++i) { if (wcscmp(pImageCodecInfo[i].MimeType, szFormat) == 0) { *pClsid = pImageCodecInfo[i].Clsid; free(pImageCodecInfo); return i; } } free(pImageCodecInfo); return -1; }
その他の回答 (1)
- akanekor
- ベストアンサー率52% (102/194)
ヘッダに書いてね。 LPPICTURE m_pJpeg; BOOL CE_tikanDlg::ReadJpg(CString strJpgPathFileName) { // IPictureインターフェイスを初期化 m_pJpeg = NULL; // JPEGファイルを読み込む CFile fp; BOOL bret = fp.Open( strJpgPathFileName, CFile::modeRead); if( bret == FALSE) { AfxMessageBox( "jpgがありません"); return FALSE; } DWORD dwSize = fp.GetLength(); // グローバル領域を確保 HGLOBAL h = ::GlobalAlloc( GMEM_MOVEABLE, dwSize); if(h == NULL) { fp.Close(); AfxMessageBox( "メモリがエラー"); return FALSE; } // 領域をロック void *pBuf = ::GlobalLock( h); if( pBuf == NULL) { fp.Close(); ::GlobalFree( h); AfxMessageBox( "GlobalLock失敗"); return FALSE; } // ファイルの読み込み if( fp.Read( pBuf, dwSize) != dwSize) { fp.Close(); ::GlobalUnlock( h); ::GlobalFree( h); AfxMessageBox("読み込みエラー"); return FALSE; } // ファイルのクローズ fp.Close(); ::GlobalUnlock( h); // IStreamを取得する LPSTREAM pstm = NULL; // グローバル領域からIStreamを作成 HRESULT hr = ::CreateStreamOnHGlobal(h, TRUE, &pstm); if( SUCCEEDED(hr) == FALSE) { return FALSE; } // IPictureのオブジェクトのアドレスを取得 hr = ::OleLoadPicture(pstm, dwSize, FALSE, IID_IPicture, (LPVOID *)&m_pJpeg); if( SUCCEEDED( hr) == FALSE || m_pJpeg == NULL) { pstm->Release(); AfxMessageBox( "IStream失敗"); return FALSE; } // IStreamオブジェクトを開放 pstm->Release(); // 以上までが、jpg読み込み CPaintDC dc(this); long hmWidth; long hmHeight; m_pJpeg->get_Width(&hmWidth); m_pJpeg->get_Height(&hmHeight); CSize size( hmWidth, hmHeight); // HIMETRIC 単位をデバイス単位に変換 dc.HIMETRICtoDP(&size); HBITMAP hBmp; hBmp = CreateCompatibleBitmap(dc, size.cx, size.cy); // 以上で BMPに変更 で、白黒変更は、自分、知らないので、たぶんここが参考になるっぽい http://hpcgi1.nifty.com/MADIA/DelphiBBS/wwwlng.cgi?print+200206/02060010.txt
関連するQ&A
- 画像の色が白黒になる
ダウンロードした画像(マイピクチャーに一旦保存)をフォトショップで加工しようとしたのですが、白黒になり困っています。 フォトショップを開いて、ファイルからjpg画像を開く、カラーで表示される。それを加工して新規作成バナーにドロップすると、モノクロになる。 今までは問題なかったのですが、今回取り込んだ画像のみこんな現象が起きます。取り込む前の基の画像の保存方法と今回の私の保存方法が違うのか? 対処方法を教えてください。
- ベストアンサー
- その他(ソフトウェア)
- jpg グレー画像を jpg RGB画像に変えたい
Photoshop Elements 7です。添付イラストの枠を青に、象を黄色にしたのですが jpg@ 122%(グレー/8) となっていて白黒しか反応しません。 これをRGB画像にする方法を 教えてください。よろしくお願いいたします。
- ベストアンサー
- Photoshop(フォトショップ)
- pictureBoxの画素値取得法
VC++2010Expressを使用しています。 pictureBox1->ImageLocation = "○○.jpg"; として画像を表示しました。 この表示画像の指定した座標の画素値(RGB)を取得するにはどのようにすればよいでしょうか。
- ベストアンサー
- C・C++・C#
- 画像の読み込み&白黒判別プログラム(2階調・2値化)
ビットマップの画像で太い曲線が書いてあるデータをVBで読み込み,それを白黒2階調にして表示させ,輪郭を抽出し,その曲線の平均のライン(中心のライン)を取得するというプログラムを制作しています。 現在,データ取り込み&白黒化で行き詰っています。 詳しく解説があるサイトやサンプルを紹介していただければ幸いです。 環境 Visual Basic 6.0 Windows 2000
- ベストアンサー
- Visual Basic
- C言語で白黒の画像表現
C言語による画像再構成の基礎 (画像再構成シリーズ) という本に基づいてC言語で画像再構成のプログラミングの勉強をしているのですが、この本の中で白い部分を100、黒い部分を0と画像を表現するプログラムを組んだあとそれを白と黒の画像にするソフトが明記されていませんでした。そのページが以下です。 http://autolandtom.web.fc2.com/text.html 赤下線部の「画像表示専用のソフト」を何かが存じの方がいらっしゃいましたら教えてくだいさい。 よろしくお願い致します。
- 締切済み
- 画像・動画・音楽編集
- OpenCVによる時間差表示
書き込みさせていただきます。 今OpenCVをインストールしてVC++にてプログラミングをしています。 カメラ画像を取得してそこに点を打とうとしています。 //中心 cvCircle(frameImage,cvPoint(320,250),1,CV_RGB(0,255,0),5,8,0); //右隅 cvCircle(frameImage,cvPoint(635,250),1,CV_RGB(0,255,0),5,8,0); //左隅 cvCircle(frameImage,cvPoint(5,250),1,CV_RGB(0,255,0),5,8,0); //上 cvCircle(frameImage,cvPoint(320,470),1,CV_RGB(0,255,0),5,8,0); //下 cvCircle(frameImage,cvPoint(320,5),1,CV_RGB(0,255,0),5,8,0); のようにして無理やり点を作って表示させることができました。 この点を 中心→0秒から5秒まで表示 右隅→5秒から10秒まで表示 左隅→10秒から15秒まで表示 のように時間をずらして表示するようなプログラムを作りたいのですが、やり方が調べてもよくわかりません。 教えていただければ幸いです。 よろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- TCPでデータを受け取ってそれを画像として連続表示する、いわゆるストリ
TCPでデータを受け取ってそれを画像として連続表示する、いわゆるストリーミング動画再生ソフトを作ろうと思っています。 ソフトウェアプログラミングは疎く、TCPでのデータの受信プログラムの作成はできるのですが、PCへの負荷を最小限にして表示する方法がよくわからず困っております。 動画サイズは、1280*720のフルカラーで、60fpsで表示したいと考えています。 画像は非圧縮のベタデータで送られてきます。 VC++とDirectXを用いれば高速に表示できるかと思い(どちらも使用は初めてです)、この数日調べまわっていますが、まずベタデータを表示することすらままならず(ファイルを読み出してテクスチャを作成し、レンダリングするという情報は多いのですが。。)、それがなんとかできても今度はそのデータを変えてアニメーション表示しようとするとメモリーを山のように消費してまともに動かないプログラムが出来上がったりと、なんとも苦しんでおります。 当方使用できるプログラミング言語はC言語のみですが、必要であればC++も勉強して使用したいと思います。 どのような手法が最適で、どのような手順でやればいいのか、ヒントだけでも、教えていただければ助かります。
- ベストアンサー
- その他(プログラミング・開発)
- ウィンドウに画像を表示するソフトを作っているのですが
ピクチャーボックスに画像ファイルをドラッグ&ドロップすることで同ピクチャーボックスに画像を表示するソフトを作っているのですが ・実行ファイルに画像をドラッグ&ドロップすると画像を表示する ・既に画像を表示しているウィンドウ(ピクチャーボックス)に画像をドラッグ&ドロップすると、新しいウィンドウを開きそこにドロップされた画像を表示する このような動作をさせるにはどうプログラミングすればよいのでしょうか? Windows VistaでVisual Basic2008を使用しています。 よろしくお願いします。
- 締切済み
- Visual Basic
- HPの画像が正常に表示されません
ホームページビルダーで制作したデータを yahooジオシティーにアップしましたが、画像が 正常に表示されません。×印ではありません。 画像に変な色がついたり半分がずれてしまったり とにかく正常ではないのです。 画像の拡張子はjpgにしていますが、RGBとCMYKは関係は あるのでしょうか? ホームページビルダー上では正常なのに FTPサーバーに アップしたとたんに 画像が壊れてしまっています。 原因を教えてください。よろしくお願いいたします。
- ベストアンサー
- ブログ