• ベストアンサー

C++でBMP解析

タイトルの通り、 C++でBMPのデータを取得したいと思いますがやり方がわかりません。 たとえば座標(3,6)にはFF0000の色が使われているなどです。 windowsの場合です。

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

  • ベストアンサー
回答No.2

 こんにちは。  思いっきり簡単に書けば大体以下のwin32apiを使用する事に成ります。 #include<windows.h> #include<stdio.h> int main() { //ビットマップを読み込む HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, TEXT("test.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE); //デバイスコンテキストを作成 HDC hDCMem = ::CreateCompatibleDC(NULL); //デバイスコンテキストにビットマップを選択 HGDIOBJ hBitmapOld = ::SelectObject(hDCMem, hBitmap); //(3, 6)の色彩を取る const COLORREF color = ::GetPixel(hDCMem, 3, 6); //RGBをプリントする ::printf("[赤:%d][緑:%d][青:%d]\n", GetRValue(color), GetGValue(color), GetBValue(color)); //デバイスコンテキストの復元 ::SelectObject(hDCMem, hBitmapOld); //デバイスコンテキストの削除 ::DeleteDC(hDCMem); //ビットマップの削除 ::DeleteObject(hBitmap); return 0; }

hosepens
質問者

お礼

いろいろサイトを見たのですが、 あまりよくわかりませんでしたが、 これはわかりやすかったです。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

参考になりますでしょうか C言語による画像処理プログラミング http://coconut.sys.eng.shizuoka.ac.jp/bmp/ 画像Viewerを作ろう http://www.ysaitoh.k.hosei.ac.jp/labor/2002/otogawa/cpp/ImageViewer3.html

hosepens
質問者

お礼

なかなか複雑ですね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • FORTRAN でBMP画像の値の取得

    FORTRAN でBMP画像の値の取得をしたいのですが,どうすればいいでしょう? たとえば,10×10画素の8bitのbmp画像の各ピクセルの値を読んで,テキストに書き出したいとします. ですので,できるファイルは・・ 1,1,255 1,2,255 ・ ・ ・ みたいに,X座標,Y座標,そこの値 っていうふうにしたいんです. わからないのは,BMP画像の値の取得方法です. また,bmpを読み込んで,その情報を元にまたbmpを作る時はどうすればいいでしょう? 長々とすいません.

  • C#について

    C#で画像の色を変更しようと頑張っているのですが・・・ クリックした座標と同じ色の場所を青にしたいです。 XとYは画像の座標の大体の最大値です。 public partial class Form1 : Form { Bitmap bmp; public Form1() { InitializeComponent(); bmp = new Bitmap(pB1.Image); } private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { Color c = bmp.GetPixel(e.X, e.Y); for (int Y = 0; Y < 280; Y++) { for (int X = 0; X < 240; X++) { Color c2 = bmp.GetPixel(X, Y); if (c.R == c2.R && c.G == c2.G && c.B == c2.B) { bmp.SetPixel(X, Y, Color.FromArgb(0, 0, 255)); } } } } } } クリックしたところと同じ色を青(0, 0, 255)に変更したいのですが変更されません。 間違っているところなどがあれば教えてください。

  • c言語を使いダイアログにbmpを表示したい 

    はじめまして、 私は、c言語は初心者なのでが、ダイアログボックスに、画像(bmp)が表示することができません。 ソースは、 hdc = BeginPaint(hDlg, &ps); //指定ウィンドウ内での描写準備 // ビットマップをファイルからロードする hBitmap = ::LoadBitmap( NULL, _T("test.bmp") ); // ウィンドウのデバイスコンテキストハンドルを取得する hDC = GetDC( hDlg ); // メモリデバイスコンテキストを作成する hCompatDC = CreateCompatibleDC( hDC ); // ロードしたビットマップを選択する GetObject(hBitmap, sizeof(BITMAP), &bmp); // ビットマップをウィンドウに転送する(表示する) if(hBitmap != NULL){ StretchBlt( hDC, 0, 0, 100, 100, hCompatDC, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY ); SendDlgItemMessage( hDlg, IDC_STATIC, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap); } なのですが、これはメインウィンドウでは動くのですが、ダイアログボックスでは動かずこまっています。 どうか、助言のほどよろしくお願いします。

  • BMP 仕様

    言語:C++ 標準ライブラリのみ OS:Windows 以上の条件でビットマップを表示したいと考えています。 ただし、今後JPEGなど別フォーマットでも対応できるようにするためLoadImage関数などは使用しないものとします。 //ファイル読み込み ifstream in( fileName.c_str(), ifstream::binary); ~ //char* _data in.read( _data, _size ); //データ取得 unsigned long getUnLng( int Index ) const { //unsigned char* _unChar = _data; //データ単位がnバイトごとの場合は別に考慮する unsigned long unLng = _unChar[Index]; return unLng; } 上記で画像データは取得できるのですが、どこに何が入っているのかがわかりません。 Index = 0 の場合 B Index = 1 の場合 M などが取得できるのですが、これが何を意味しているのかを知りたいのです。 幅や高さ、色の情報がどこに存在するかの詳細は分かりませんでしょうか。 ----例 幅  :Index 10 ~ 13 高さ :Index 14 ~ 17 ・幅×高さが 2×3 の場合 色情報:Index 18 ~ 23 ---- 説明が下手で申し訳ありません。 ご指摘いただければ情報の補足はさせていただきますのでよろしくお願いいたします。

  • bmpファイルの解析

    Cプログラムでbmpファイルを読み込み 最大輝度(仮にbrightnessとします)とその座標(仮にx,yとします)を吐き出させるプログラムを作りたいのですが、うまくいきません。 アドバイスしていただければ助かります。 宜しくお願いします。 以下に作成したソースを載せています。 #include<stdlib.h> #include<stdio.h> #include<string.h>/*strcat関数で必要*/ unsigned char brightness; int x_size,y_size,/*imageの横画像数、縦画素数*/ x,y,/*ループ変数*/ max_brightness=0,/*最大輝度*/ max_x,/*最大輝度時のx座標*/ max_y;/*最大輝度時のy座標*/ int main(int argc,char* argv[]) { FILE *fp; char buffer[60000]; char file_name[256]; printf("ファイル名入力="); gets(file_name); strcat(file_name,".bmp"); fp = fopen(file_name, "r"); for(y=0; y<y_size; y++){ for(x=0; x<x_size; x++){ brightness=getc(fp); if(brightness>max_brightness) max_brightness=brightness; max_y=y; max_x=x; } } printf("最大輝度=%d\n",max_brightness); printf("(x,y)=(%d,%d)\n",max_x,max_y); if ( ! fp ) { printf("ファイルが開けません\n"); return 1; } fclose(fp); return 0; }

  • 最小化されたウインドウの任意の座標の色

    最小化されてないウインドウの任意の座標上の色を取得するには、APIのGetPixel関数を使って出来たのですが、そのウインドウが最小化されている場合は-1という値が返ってきて色を取得できませんでした。 最小化されたウインドウの任意の座標の色を取得すにはどうすればいいのでしょうか? よろしくお願い致します。

  • Cでアニメーションプログラムをつくりたい

    時間t x座標 y座標 0.0  0   0 0.1  1.0  -1.0 0.2  1.5  -1.5 0.3  2.0  -2.0 ・ ・ ・ ・ のようなデータファイルがあったとき、これを読み込んで図形(例えば円)をデータの通りに動かすCプログラムをつくりたいのですが、どうすればいいのでしょうか? 具体的なコードを書いて頂けると大感謝なのですが、例えば「〇〇というAPI関数を使って、forループを使ってこんな風に書けばいいんじゃない」というような感じの指針を頂けるだけでも構いません。よろしくおねがいします。 ちなみに、さっきやっとウィンドウを出せたばかり、という状況です。 環境はWindows98SEです。 あと、WindowsのAPIのリファレンスってWeb上にないのでしょうか?(ちょっと検索したのですが、書籍しか見つかりませんでした…)

  • BMPファイルへの書き込みができない

    このプログラムは、左半分を黒、右半分を白の画像をBMPファイルに出力しようとしています。(出来ていません) プログラムの下に質問書いてます!お願いします! #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct{ char *filename; int x; int y; int width; int height; unsigned char data[80][100]; } BMP_DATA; static void WriteBmp(char *filename, BMP_DATA Image) { unsigned long Bmp_size;/*BMPファイルのサイズ*/ unsigned int Bmp_info_header_size;/*情報ヘッダのサイズ*/ unsigned int Bmp_header_size;/*ヘッダのサイズ*/ long Bmp_width;/*幅*/ long Bmp_height;/*高さ*/ unsigned short Bmp_planes;/*プレーン数*/ unsigned short Bmp_color;/*色 = 1[bit] (黒か白かだけ)*/ long Bmp_image_size;/*画像部分のサイズ*/ long Bmp_xppm;/*水平解像度*/ long Bmp_yppm;/*垂直解像度*/ int i,j; unsigned char Bmp_headbuf[54]; /*ヘッダ*/ unsigned char Bmp_Data[13]; FILE *Out = fopen(filename, "wb"); if(Out==NULL){ fclose(Out); exit(1); } /* ヘッダ情報の準備 */ Bmp_info_header_size = 40; Bmp_header_size = 54; Bmp_planes = 1; Bmp_color = 1; Bmp_image_size = Image.height * Image.width; Bmp_xppm = 0; Bmp_yppm = 0; Bmp_size = Bmp_image_size + Bmp_header_size; Bmp_headbuf[0] = 'B'; Bmp_headbuf[1] = 'M'; memcpy(Bmp_headbuf+2, &Bmp_size, sizeof(Bmp_size)); Bmp_headbuf[6] = 0; Bmp_headbuf[7] = 0; Bmp_headbuf[8] = 0; Bmp_headbuf[9] = 0; memcpy(Bmp_headbuf+10, &Bmp_header_size, sizeof(Bmp_header_size)); Bmp_headbuf[11] = 0; Bmp_headbuf[12] = 0; Bmp_headbuf[13] = 0; memcpy(Bmp_headbuf+14, &Bmp_info_header_size, sizeof(Bmp_info_header_size)); Bmp_headbuf[15] = 0; Bmp_headbuf[16] = 0; Bmp_headbuf[17] = 0; memcpy(Bmp_headbuf+18, &Image.width, sizeof(Bmp_width)); memcpy(Bmp_headbuf+22, &Image.height, sizeof(Bmp_height)); memcpy(Bmp_headbuf+26, &Bmp_planes, sizeof(Bmp_planes)); memcpy(Bmp_headbuf+28, &Bmp_color, sizeof(Bmp_color)); memcpy(Bmp_headbuf+34, &Bmp_image_size, sizeof(Bmp_image_size)); memcpy(Bmp_headbuf+38, &Bmp_xppm, sizeof(Bmp_xppm)); memcpy(Bmp_headbuf+42, &Bmp_yppm, sizeof(Bmp_yppm)); Bmp_headbuf[46] = 0; Bmp_headbuf[47] = 0; Bmp_headbuf[48] = 0; Bmp_headbuf[49] = 0; Bmp_headbuf[50] = 0; Bmp_headbuf[51] = 0; Bmp_headbuf[52] = 0; Bmp_headbuf[53] = 0; /* ヘッダ情報書き出し */ fwrite(Bmp_headbuf, sizeof(unsigned char), Bmp_header_size, Out); /* 画像データ書き出し */ for(i=0;i<13;i++) Bmp_Data[i] = 0; for(i=0; i<Image.height; i++){ for(j=0; j<Image.width; j++){ int index = j/8; if(j%8 == 0){ Bmp_Data[index] = Image.data[i][j ] * 128 + Image.data[i][j+1] * 64 + Image.data[i][j+2] * 32 + Image.data[i][j+3] * 16 + Image.data[i][j+4] * 8 + Image.data[i][j+5] * 4 + Image.data[i][j+6] * 2 + Image.data[i][j+7]; } } Bmp_Data[12] = (Bmp_Data[12] & 0xf0); fwrite(Bmp_Data, sizeof(unsigned char), 20, Out); /* ○ */ } fclose(Out); } int main() { BMP_DATA Image; int line = 0; int i,j; Image.x = 0; Image.y = 0; Image.width = 100; Image.height = 80; if(line == 0){ for(i=0; i<Image.height; i++){ for(j=0; j<Image.width; j++){ Image.data[i][j] = 1; } } } while(1){ /* BMPファイルデータを編集 */ for(j=0; j<Image.width; j++){ if(j < 50){ Image.data[line][j] = 0;//black }else{ Image.data[line][j] = 1;//white } } /* すべての列を編集したら、再描画する */ if(line == 63){ /* BMPファイルに書込む */ WriteBmp("display.bmp", Image); break; } line++; } return 0; } 以下の条件で、BMPファイルへ書き込もうとしています ・色の深さ1(黒か白) ・画像のピクセルサイズ(横100×縦80) fwrite関数で1列ずつ書き込もうとしているのですが、 この関数は1バイトずつしか書き込めないみたいで、100ビット書き込もうと思うと、 最低でも104ビット書き込まなくてはならない状況になります。 まず、この4ビットはどう処理すればいいのでしょうか?? あと、display.bmpのファイルがある状態で、プログラムを実行するとちゃんと動くのですが、 プログラム中の○のところのfwrite関数の第三引数を13にすると、BMPファイルが壊れて閲覧できなくなります。(ある程度大きい数字だと、BMPファイルは壊れないのですが、ぐちゃぐちゃの絵になります) その理由もわかりません。 汚い文章&プログラムですが よろしくお願いします><

  • VBAでbmp画像をASCIIデータとして開く

    VBAでbmp画像ファイルをASCIIの配列データとして開き、 青色を全て赤色に変更して、jpegファイルとして保存するようなプログラムを書きたいのですが bmpファイルををASCIIの配列データとして開くためにはどのような記述を使えば良いでしょうか?

  • 4階調BMPファイルの構成

    こんにちわ。お世話になります。 WINDOWSのBMPファイルで白黒4階調のデーターは許されているのでしょうか? 存在するのであればデーター構成を教えていただけませんでしょうか。 よろしくお願いします。