ページ 11

テキストファイルでの範囲指定

Posted: 2009年12月03日(木) 18:41
by SIT
ビットマップ画像からRGBの値を抽出するプログラムを作成しましたが、画像の周りの余白の部分がいらないので、画像の4隅の座標をテキストファイルで指定してその中のRGBの値を抽出するにはどうしたらいいでしょうか?

ご教授の程、よろしくお願いします。



#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <malloc.h>


int main( int argc, char **argv )
{
BITMAPFILEHEADER bf;
BITMAPINFOHEADER bi;
char *filename;
FILE *fp;
RGBTRIPLE *buf, **data;
unsigned char R,G,B;
int LineSize,BufferSize;
int x, y;

//ファイルを開く
if ( argc != 2){
filename = "bitmap2.bmp";
} else {
filename = argv[1];
}

//ファイルを開く
fp = fopen( filename, "rb");
fread( &bf, sizeof(BITMAPFILEHEADER), 1, fp );
fread( &bi, sizeof(BITMAPINFOHEADER), 1, fp );

if (bi.biBitCount !=24){
printf("このファイルは24bit画像専用です\n");
return 0;
}


if((bi.biWidth % 4) == 0){
LineSize = sizeof(RGBTRIPLE) * bi.biWidth ;
} else {
LineSize = sizeof(RGBTRIPLE) * bi.biWidth + (4 - (bi.biWidth * 3) % 4) ;
}
BufferSize = LineSize * bi.biHeight;


//変換元のデータ
buf = (RGBTRIPLE *)malloc( BufferSize );
data = (RGBTRIPLE **)malloc( sizeof(RGBTRIPLE *) * bi.biHeight );


//RGB別に出力する
for ( y = 0; y <= bi.biHeight; y++ ) {
data[ y ] = (RGBTRIPLE *)((char*)buf + LineSize * y);
}

fread( buf, BufferSize, 1, fp );
for ( y = 0; y <= bi.biHeight; y++ ) {
for ( x = 0; x <= bi.biWidth; x++) {


R = data[ y ][ x ].rgbtRed;
G = data[ y ][ x ].rgbtGreen;
B = data[ y ][ x ].rgbtBlue;

printf("X軸:%d,Y軸:%d, R:%d, G:%d, B:%d\n", x, y, R, G, B);

}
}


return 0;
}

Re:テキストファイルでの範囲指定

Posted: 2009年12月03日(木) 19:01
by GPGA
>for ( y = 0; y <= bi.biHeight; y++ ) {
>for ( x = 0; x <= bi.biWidth; x++) {
とりあえず、アクセス違反になりますよ


抽出っていうのはprintfで出力すればいいのかな?
struct POINT {
 int x, y;
} point[4]; // この中に左上、右上、左下、右下の座標が入っているとして

for ( y = bi.biHeight - point[0].y - 1; y >= bi.biHeight - point[2].y; y-- ) { 
  for ( x = point[0].x; x < point[1].x; x++) {
    R = data[ y ][ x ].rgbtRed; 
    G = data[ y ][ x ].rgbtGreen; 
    B = data[ y ][ x ].rgbtBlue; 

    printf("X軸:%d,Y軸:%d, R:%d, G:%d, B:%d\n", x, y, R, G, B);
  }
}

Re:テキストファイルでの範囲指定

Posted: 2009年12月04日(金) 16:20
by SIT
GPGA様、早速のアドバイスありがとうございます。
さらに、説明不足でした事をお詫びいたします。

抽出という意味は仰る通り、printfで出力です。
コマンドプロンプトで実行してコマンドプロンプト内に表示している感じです。


画像の座標4隅をメモ帳等で座標を書いたテキストファイルを作りその座標間のRGBを出力するプログラムです。


>>for ( y = 0; y <= bi.biHeight; y++ ) {
>>for ( x = 0; x <= bi.biWidth; x++) {
>とりあえず、アクセス違反になりますよ

一応エラーは出なかったのですが、ここは間違っていますでしょうか?
ソースコード全体を書くと、どういうプログラムになりますか?

Re:テキストファイルでの範囲指定

Posted: 2009年12月04日(金) 17:36
by GPGA
>一応エラーは出なかったのですが、ここは間違っていますでしょうか?
読み込みのみなので、エラーにならなかっただけです。
以下がアクセス違反していることがわかりますか?
static const int WIDTH = 10;
static const int HEIGHT = 20;
int n[HEIGHT][WIDTH] = {0};
for (int y = 0; y <= HEIGHT ; ++y) {
  for (int x = 0; x <= WIDTH; ++x) {
    printf("n[%d][%d] = %d", y, x, n[y][x]);
  }
}

>ソースコード全体を書くと、どういうプログラムになりますか?
最初に提示されているプログラムから、Cの基本はできていると判断しています。
テキストファイルの読み込みは、勝手にやってください。
POINT構造体の中にデータが入れば、どんなやり方でもいいです。

for以降のプログラムは最初に提示された
//RGB別に出力する
の部分を書き換えたものです。

Re:テキストファイルでの範囲指定

Posted: 2009年12月04日(金) 18:37
by SIT
GPGA様、POINTの中にとりあえずデータを入れてご指摘の部分も直したところ
うまくできました。

アドバイス等のご教授ありがとうございました。