Bitmapファイルを入出力してみる
をテンプレートにして作成
home
>
サイトマップ
開始行:
RIGHT:寄稿:東條遼平
今後いろいろと加工してみたいので最初に入出力をできるよう...
* Bitmapは扱いやすい [#hdd03764]
画像ファイルは基本的にRGB情報(光の三原色です)とヘッダの部...
* ヘッダについて [#da585bb6]
まずBitmapは大きく3つの部分に分かれています。
|ファイルヘッダ|オフセット(0)|ファイルタイプ|BMといれる|
|~|オフセット(2)|ファイルサイズ|ファイル全体のサイズをバ...
|~|オフセット(6)|予約領域1|常に0を入れておく|
|~|オフセット(8)|予約領域2|常に0を入れておく|
|~|オフセット(10)|画像データまでのオフセット|24bitのBitma...
|情報ヘッダ|オフセット(14)|情報ヘッダのサイズ|40を入れる|
|~|オフセット(18)|画像の幅|ピクセル単位|
|~|オフセット(22)|画像の高さ|ピクセル単位|
|~|オフセット(26)|プレーン数|常に1を入れる|
|~|オフセット(28)|何ビットのカラー画像であるか|今回は24と...
|~|オフセット(30)|圧縮形式|非圧縮なので0を入れる|
|~|オフセット(34)|画像データのサイズ|ヘッダ部分を含まない...
|~|オフセット(38)|水平解像度|0で問題ない|
|~|オフセット(42)|垂直解像度|0で問題ない|
|~|オフセット(46)|パレットの色数|パレットは使わないので0|
|~|オフセット(50)|重要なパレットのインデックス|使わないの...
いろいろなパラメータがありますが、要は読み取り部分で"BM"...
* ソースコード [#eac56563]
/*----------------------bitmap.h----------------------*/
typedef struct{
unsigned char b;
unsigned char g;
unsigned char r;
}Rgb;
typedef struct{
unsigned int height;
unsigned int width;
Rgb *data;
}Image;
ヘッダ部分でRGB情報を格納する構造体と、幅、高さ、RGB情報...
/*--------------------------bitmap.c--------------------...
//画像の見た目上の幅を取得
memcpy(&width, header_buf + 18, sizeof(width));
//画像の高さを取得
memcpy(&height, header_buf + 22, sizeof(height));
//何bitのBitmapであるかを取得
memcpy(&color, header_buf + 28, sizeof(unsigned int));
//RGB情報は画像の1行分が4byteの倍数で無ければならないた...
real_width = width*3 + width%4;
//BitmapファイルのRGB情報は左下から右へ、下から上に並ん...
for(i=0; i<height; i++){
fread(bmp_line_data, 1, real_width, fp);
for(j=0; j<width; j++){
img->data[(height-i-1)*width + j].b = bmp_line_data[...
img->data[(height-i-1)*width + j].g = bmp_line_data[...
img->data[(height-i-1)*width + j].r = bmp_line_data[...
}
}
幅や高さなどはmemcpyを使えば簡単です。このとき先頭番地+そ...
- &ref(main.c);
- &ref(bitmap.h);
- &ref(bitmap.c);
これらのファイルを同じディレクトリに入れ、
$gcc main.c bitmap.c
とすれば実行可能ファイルができ、
$./a.out inputfile.bmp outputfile.bmp
で実行できます。 makefile作った方がいいのですが、ファイル...
終了行:
RIGHT:寄稿:東條遼平
今後いろいろと加工してみたいので最初に入出力をできるよう...
* Bitmapは扱いやすい [#hdd03764]
画像ファイルは基本的にRGB情報(光の三原色です)とヘッダの部...
* ヘッダについて [#da585bb6]
まずBitmapは大きく3つの部分に分かれています。
|ファイルヘッダ|オフセット(0)|ファイルタイプ|BMといれる|
|~|オフセット(2)|ファイルサイズ|ファイル全体のサイズをバ...
|~|オフセット(6)|予約領域1|常に0を入れておく|
|~|オフセット(8)|予約領域2|常に0を入れておく|
|~|オフセット(10)|画像データまでのオフセット|24bitのBitma...
|情報ヘッダ|オフセット(14)|情報ヘッダのサイズ|40を入れる|
|~|オフセット(18)|画像の幅|ピクセル単位|
|~|オフセット(22)|画像の高さ|ピクセル単位|
|~|オフセット(26)|プレーン数|常に1を入れる|
|~|オフセット(28)|何ビットのカラー画像であるか|今回は24と...
|~|オフセット(30)|圧縮形式|非圧縮なので0を入れる|
|~|オフセット(34)|画像データのサイズ|ヘッダ部分を含まない...
|~|オフセット(38)|水平解像度|0で問題ない|
|~|オフセット(42)|垂直解像度|0で問題ない|
|~|オフセット(46)|パレットの色数|パレットは使わないので0|
|~|オフセット(50)|重要なパレットのインデックス|使わないの...
いろいろなパラメータがありますが、要は読み取り部分で"BM"...
* ソースコード [#eac56563]
/*----------------------bitmap.h----------------------*/
typedef struct{
unsigned char b;
unsigned char g;
unsigned char r;
}Rgb;
typedef struct{
unsigned int height;
unsigned int width;
Rgb *data;
}Image;
ヘッダ部分でRGB情報を格納する構造体と、幅、高さ、RGB情報...
/*--------------------------bitmap.c--------------------...
//画像の見た目上の幅を取得
memcpy(&width, header_buf + 18, sizeof(width));
//画像の高さを取得
memcpy(&height, header_buf + 22, sizeof(height));
//何bitのBitmapであるかを取得
memcpy(&color, header_buf + 28, sizeof(unsigned int));
//RGB情報は画像の1行分が4byteの倍数で無ければならないた...
real_width = width*3 + width%4;
//BitmapファイルのRGB情報は左下から右へ、下から上に並ん...
for(i=0; i<height; i++){
fread(bmp_line_data, 1, real_width, fp);
for(j=0; j<width; j++){
img->data[(height-i-1)*width + j].b = bmp_line_data[...
img->data[(height-i-1)*width + j].g = bmp_line_data[...
img->data[(height-i-1)*width + j].r = bmp_line_data[...
}
}
幅や高さなどはmemcpyを使えば簡単です。このとき先頭番地+そ...
- &ref(main.c);
- &ref(bitmap.h);
- &ref(bitmap.c);
これらのファイルを同じディレクトリに入れ、
$gcc main.c bitmap.c
とすれば実行可能ファイルができ、
$./a.out inputfile.bmp outputfile.bmp
で実行できます。 makefile作った方がいいのですが、ファイル...
ページ名:
home
>
Modified by
物理のかぎプロジェクト
PukiWiki 1.4.5_1
Copyright © 2001-2005
PukiWiki Developers Team
. License is
GPL
.
Based on "PukiWiki" 1.3 by
yu-ji
Powered by PHP 5.3.29HTML convert time to 0.002 sec.