#17
by fabersid » 6年前
先ほどの内容
► スポイラーを表示
すみません、引数を乗せ忘れていました。
出力を簡単にテストするために
引数:ffffff00
でテストしてました。
コード:
BMP_maker ffffff00
42 4d
00 00 00 00 <― 画像ファイルの大きさ。固定、または複数の大きさに対応するなら計算する
00 00
00 00
36 00 00 00
28 00 00 00
01 00 00 00 ← 画像の横幅。3x3のビットマップを作りたかったはずなのになんで1?
01 00 00 00 ← 画像の縦幅。3x3のビットマップを作りたかったはずなのになんで1?
00 00 <― 「プレーン数」。1固定で計算の必要は無い
00 00 <― ピクセルあたりのビット数。計算というよりフォーマットに応じて決め打ち?長さから計算する?
00 00 00 00
00 00 00 00 <― 画像データ本体の大きさ。固定、または複数の大きさに対応するなら計算する
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00
計算するといっても詰め物である00の数がわからない以上
ファイルとデータ本体の大きさがわかりません。
また、初期値の値を変更したので
「プレーン数」とピクセル当たりのビット数(biBitCount 2byte 色ビット数[bit])
がそれぞれ
01 00(10行目)
18 00(11行目)
になりました。
現在のコード
► スポイラーを表示
コード:
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <winsock2.h>
typedef struct type_BMP{
char H00[(2+1)*2]; //bfType 'As Integer 'ファイルタイプ
char H02[(2+1)*4]; //bfSize 'As Long 'ファイルサイズ[byte]
char H06[(2+1)*2]; //bfReserved1 'As Integer '予約領域1
char H08[(2+1)*2]; //bfReserved2 'As Integer '予約領域2
char H0A[(2+1)*4]; //bfOffBits 'As Long 'ファイル先頭から画像データまでのオフセット[byte]
char H0E[(2+1)*4]; //biSize 'As Long '情報ヘッダサイズ[byte]
char H12[(2+1)*4]; //biWidth 'As Long '画像の幅[ピクセル]
char H16[(2+1)*4]; //biHeight 'As Long '画像の高さ[ピクセル]
char H1A[(2+1)*2]; //biPlanes 'As Integer 'プレーン数
char H1C[(2+1)*2]; //biBitCount 'As Integer '色ビット数[bit]
char H1E[(2+1)*4]; //biCompression 'As Long '圧縮形式
char H22[(2+1)*4]; //biSizeImage 'As Long '画像データサイズ[byte]
char H26[(2+1)*4]; //biXPixPerMeter 'As Long '水平解像度[dot/m]
char H2A[(2+1)*4]; //biYPixPerMeter 'As Long '垂直解像度[dot/m]
char H2E[(2+1)*4]; //biClrUsed 'As Long '格納パレット数[使用色数]
char H32[(2+1)*4]; //biCirImportant 'As Long '重要色数
}BMP;
BMP BMP_set(int,char []);
int main(int argc,char *argv[]){
BMP outFile=BMP_set(argc,argv[1]);
//system("cls");
printf("%s\n%s\t<―\n%s\n%s\n%s\n%s\n%s\n%s\n%s\t\t<―\n%s\t\t<―\n%s\n%s\t<―\n%s\n%s\n%s\n%s",
outFile.H00,outFile.H02,outFile.H06,
outFile.H08,outFile.H0A,outFile.H0E,
outFile.H12,outFile.H16,outFile.H1A,
outFile.H1C,outFile.H1E,outFile.H22,
outFile.H26,outFile.H2A,outFile.H2E,
outFile.H32);
//argc==where_exe+row
return 0;
}
BMP BMP_set(int argc, char argv1[])
{
static BMP outFile = {
"42 4d", //2 ファイルタイプ
"00 00 00 00", //4 ファイルサイズ[byte]
"00 00", //2 予約領域1
"00 00", //2 予約領域2
"36 00 00 00", //4 ファイル先頭から画像データまでのオフセット[byte]
"28 00 00 00", //4 情報ヘッダサイズ[byte]
"00 00 00 00", //4 画像の幅[ピクセル]
"00 00 00 00", //4 画像の高さ[ピクセル]
"01 00", //2 プレーン数
"18 00", //2 色ビット数[bit]
"00 00 00 00", //4 圧縮形式
"00 00 00 00", //4 画像データサイズ[byte]
"00 00 00 00", //4 水平解像度[dot/m]
"00 00 00 00", //4 垂直解像度[dot/m]
"00 00 00 00", //4 格納パレット数[使用色数]
"00 00 00 00", //4 重要色数
};
int row = argc - 1, col = 0;
if (argc > 1) col = strlen(argv1)/8;
sprintf(outFile.H12, "%02x %02x %02x %02x",
col & 0xff, col>>8 & 0xff, col>>16 & 0xff, col>>24 & 0xff);
sprintf(outFile.H16, "%02x %02x %02x %02x",
row & 0xff, row>>8 & 0xff, row>>16 & 0xff, row>>24 & 0xff);
return outFile;
}
char * str_init(char *s){
assert(s != NULL);
return strdup(s);
}
char * str_append(char *dst, char *src){
size_t dstlen;
size_t srclen;
assert(dst != NULL);
assert(src != NULL);
dstlen = strlen(dst);
srclen = strlen(src);
dst = realloc(dst, dstlen + srclen + 1);
if (dst == NULL) {
free(dst);
return NULL;
}
strncat(dst, src, srclen);
return dst;
}
void space_htonl(int num,char ret[(2+1)*4]){
int i;
char arg[2*4+1];
sprintf(arg,"%08x",htonl(num));
for(i=0;i<4;i++){
ret[i*3]=arg[i*2];
ret[i*3+1]=arg[i*2+1];
ret[i*3+2]=' ';
}
ret[4*3-1]='\0';
//numが固定なら配列出力用retは
//変わらないはずなのになぜか
//printf("%s",ret);は毎回ランダム
}
先ほどの内容
[spoil]すみません、引数を乗せ忘れていました。
出力を簡単にテストするために
引数:ffffff00
でテストしてました。
[code=text]BMP_maker ffffff00
42 4d
00 00 00 00 <― 画像ファイルの大きさ。固定、または複数の大きさに対応するなら計算する
00 00
00 00
36 00 00 00
28 00 00 00
01 00 00 00 ← 画像の横幅。3x3のビットマップを作りたかったはずなのになんで1?
01 00 00 00 ← 画像の縦幅。3x3のビットマップを作りたかったはずなのになんで1?
00 00 <― 「プレーン数」。1固定で計算の必要は無い
00 00 <― ピクセルあたりのビット数。計算というよりフォーマットに応じて決め打ち?長さから計算する?
00 00 00 00
00 00 00 00 <― 画像データ本体の大きさ。固定、または複数の大きさに対応するなら計算する
00 00 00 00
00 00 00 00
00 00 00 00
00 00 00 00[/code][/spoil]計算するといっても詰め物である00の数がわからない以上
ファイルとデータ本体の大きさがわかりません。
また、初期値の値を変更したので
「プレーン数」とピクセル当たりのビット数(biBitCount 2byte 色ビット数[bit])
がそれぞれ
01 00(10行目)
18 00(11行目)
になりました。
現在のコード
[spoil][code=c]#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <winsock2.h>
typedef struct type_BMP{
char H00[(2+1)*2]; //bfType 'As Integer 'ファイルタイプ
char H02[(2+1)*4]; //bfSize 'As Long 'ファイルサイズ[byte]
char H06[(2+1)*2]; //bfReserved1 'As Integer '予約領域1
char H08[(2+1)*2]; //bfReserved2 'As Integer '予約領域2
char H0A[(2+1)*4]; //bfOffBits 'As Long 'ファイル先頭から画像データまでのオフセット[byte]
char H0E[(2+1)*4]; //biSize 'As Long '情報ヘッダサイズ[byte]
char H12[(2+1)*4]; //biWidth 'As Long '画像の幅[ピクセル]
char H16[(2+1)*4]; //biHeight 'As Long '画像の高さ[ピクセル]
char H1A[(2+1)*2]; //biPlanes 'As Integer 'プレーン数
char H1C[(2+1)*2]; //biBitCount 'As Integer '色ビット数[bit]
char H1E[(2+1)*4]; //biCompression 'As Long '圧縮形式
char H22[(2+1)*4]; //biSizeImage 'As Long '画像データサイズ[byte]
char H26[(2+1)*4]; //biXPixPerMeter 'As Long '水平解像度[dot/m]
char H2A[(2+1)*4]; //biYPixPerMeter 'As Long '垂直解像度[dot/m]
char H2E[(2+1)*4]; //biClrUsed 'As Long '格納パレット数[使用色数]
char H32[(2+1)*4]; //biCirImportant 'As Long '重要色数
}BMP;
BMP BMP_set(int,char []);
int main(int argc,char *argv[]){
BMP outFile=BMP_set(argc,argv[1]);
//system("cls");
printf("%s\n%s\t<―\n%s\n%s\n%s\n%s\n%s\n%s\n%s\t\t<―\n%s\t\t<―\n%s\n%s\t<―\n%s\n%s\n%s\n%s",
outFile.H00,outFile.H02,outFile.H06,
outFile.H08,outFile.H0A,outFile.H0E,
outFile.H12,outFile.H16,outFile.H1A,
outFile.H1C,outFile.H1E,outFile.H22,
outFile.H26,outFile.H2A,outFile.H2E,
outFile.H32);
//argc==where_exe+row
return 0;
}
BMP BMP_set(int argc, char argv1[])
{
static BMP outFile = {
"42 4d", //2 ファイルタイプ
"00 00 00 00", //4 ファイルサイズ[byte]
"00 00", //2 予約領域1
"00 00", //2 予約領域2
"36 00 00 00", //4 ファイル先頭から画像データまでのオフセット[byte]
"28 00 00 00", //4 情報ヘッダサイズ[byte]
"00 00 00 00", //4 画像の幅[ピクセル]
"00 00 00 00", //4 画像の高さ[ピクセル]
"01 00", //2 プレーン数
"18 00", //2 色ビット数[bit]
"00 00 00 00", //4 圧縮形式
"00 00 00 00", //4 画像データサイズ[byte]
"00 00 00 00", //4 水平解像度[dot/m]
"00 00 00 00", //4 垂直解像度[dot/m]
"00 00 00 00", //4 格納パレット数[使用色数]
"00 00 00 00", //4 重要色数
};
int row = argc - 1, col = 0;
if (argc > 1) col = strlen(argv1)/8;
sprintf(outFile.H12, "%02x %02x %02x %02x",
col & 0xff, col>>8 & 0xff, col>>16 & 0xff, col>>24 & 0xff);
sprintf(outFile.H16, "%02x %02x %02x %02x",
row & 0xff, row>>8 & 0xff, row>>16 & 0xff, row>>24 & 0xff);
return outFile;
}
char * str_init(char *s){
assert(s != NULL);
return strdup(s);
}
char * str_append(char *dst, char *src){
size_t dstlen;
size_t srclen;
assert(dst != NULL);
assert(src != NULL);
dstlen = strlen(dst);
srclen = strlen(src);
dst = realloc(dst, dstlen + srclen + 1);
if (dst == NULL) {
free(dst);
return NULL;
}
strncat(dst, src, srclen);
return dst;
}
void space_htonl(int num,char ret[(2+1)*4]){
int i;
char arg[2*4+1];
sprintf(arg,"%08x",htonl(num));
for(i=0;i<4;i++){
ret[i*3]=arg[i*2];
ret[i*3+1]=arg[i*2+1];
ret[i*3+2]=' ';
}
ret[4*3-1]='\0';
//numが固定なら配列出力用retは
//変わらないはずなのになぜか
//printf("%s",ret);は毎回ランダム
}[/code][/spoil]