#17
			
									
						
					
								by fabersid » 7年前
			
			
			先ほどの内容
► スポイラーを表示
すみません、引数を乗せ忘れていました。
出力を簡単にテストするために
引数: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]