-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathviewer.cpp
More file actions
111 lines (96 loc) · 2.82 KB
/
viewer.cpp
File metadata and controls
111 lines (96 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//viewer.cpp
/*----------------------------------------------------------------------------------*
* raw画像の簡易表示プログラム。
*----------------------------------------------------------------------------------*/
#define MARGIN 50 //余白の幅
#define RZURE 3 //立体部のずれ(ピクセル)
#define COLORSIZE 3 //1ピクセル当たりのカラー(byte)
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <errno.h>
#include <time.h>
//プロトタイプ宣言
bool getsize(int *size, char *str);
//ヘルプを表示する
void help(){
printf("stereogramとほぼ同じ使用方法です。\n出力ファイル名は指定しないでください。\n");
}
//メイン関数
int main(int argc, char *argv[])
{
char *inputfilename;
int width, height;
FILE *fp;
//乱数初期化
srand( time(NULL) );
//引数チェック
if(argc != 3){ //引数がおかしいとき
if( argc == 2 && !strcmp(argv[1], "-h") ){
help(); //ヘルプ表示
return 0;
}
printf("エラー:引数が少ない、または多いです。\n"); //エラー表示
printf("ヘルプ : stereogram -h\n");
return 1; //エラー終了1
}
//サイズ取得
if( getsize(&width, strtok(argv[1], "x")) || //文字列をxで区切る
getsize(&height, strtok(NULL, "x")) ){
//どちらかでエラーが発生した場合
printf("サイズ取得でエラーを起こしました。1番目の引数を確認してください。");
return 2; //エラー終了2
}
//入力ファイル名取得
inputfilename = argv[2];
printf("読み取り結果:\nサイズ 横%d 縦%d\n入力ファイル名%s\n", width, height, inputfilename);
//入力画像読み込み
int in_size = width*height*COLORSIZE;
unsigned char *source = new unsigned char[ in_size ]; //バッファ作成
if ((fp = fopen(inputfilename, "rb")) != NULL) {
fread(source, in_size, 1, fp);
fclose(fp);
}
else {
printf("%sが開けませんでした。", inputfilename);
return 3; //エラー終了3
}
//表示
for(int y=3; y < height; y+=5 ){
for(int x=3; x < width; x+=5 ){
//判定
if( source[ (y * width + x)*COLORSIZE ] == 0 ){
putchar('*');
}else{
putchar(' ');
}
}
putchar('\n');
}
return 0;
}
//サイズ取得に使用
bool getsize(int *size, char *str){
char *check;
//文字列がNULLならエラー
if( str == NULL ) return true;
//文字列を整数に変換
*size = strtol(str, &check, 10);
if ( errno == ERANGE ){
perror( "長整数の範囲を超えました。" );
return true;
}
else if ( *check != '\0' ){
perror( "数字文字列ではありません。" );
return true;
}
if( *size >= 10000 ){
perror( "デカすぎでしょう。" );
return true;
}
if( *size <= 0 ){
perror( "サイズが0またはマイナスです。" );
return true;
}
return false;
}