35 static void read_packed(
unsigned char *data,
int size, std::ifstream &f) {
39 for (
int pos = 0; pos < size; pos++) {
44 data[pos] = (c >> bitshift) & 1;
49 static void write_packed(
unsigned char *data,
int size, std::ofstream &f) {
53 for (
int pos = 0; pos < size; pos++) {
54 c = c | (data[pos] << bitshift);
56 if ((bitshift == -1) || (pos == size-1)) {
65 static void pnm_read(std::ifstream &file,
char *buf) {
71 file.getline(doc, BUF_SIZE);
81 static image<uchar> *loadPBM(
const char *name) {
85 std::ifstream file(name, std::ios::in | std::ios::binary);
87 if (strncmp(buf,
"P4", 2))
91 int width = atoi(buf);
93 int height = atoi(buf);
96 image<uchar> *im =
new image<uchar>(width, height);
97 for (
int i = 0; i < height; i++)
98 read_packed(imPtr(im, 0, i), width, file);
103 static void savePBM(image<uchar> *im,
const char *name) {
104 int width = im->width();
105 int height = im->height();
106 std::ofstream file(name, std::ios::out | std::ios::binary);
108 file <<
"P4\n" << width <<
" " << height <<
"\n";
109 for (
int i = 0; i < height; i++)
110 write_packed(imPtr(im, 0, i), width, file);
113 static image<uchar> *loadPGM(
const char *name) {
117 std::ifstream file(name, std::ios::in | std::ios::binary);
119 if (strncmp(buf,
"P5", 2))
123 int width = atoi(buf);
125 int height = atoi(buf);
128 if (atoi(buf) > UCHAR_MAX)
132 image<uchar> *im =
new image<uchar>(width, height);
133 file.read((
char *)imPtr(im, 0, 0), width * height *
sizeof(uchar));
138 static void savePGM(image<uchar> *im,
const char *name) {
139 int width = im->width();
140 int height = im->height();
141 std::ofstream file(name, std::ios::out | std::ios::binary);
143 file <<
"P5\n" << width <<
" " << height <<
"\n" << UCHAR_MAX <<
"\n";
144 file.write((
char *)imPtr(im, 0, 0), width * height *
sizeof(uchar));
147 static image<rgb> *loadPPM(
const char *name) {
148 char buf[BUF_SIZE], doc[BUF_SIZE];
151 std::ifstream file(name, std::ios::in | std::ios::binary);
153 if (strncmp(buf,
"P6", 2))
157 int width = atoi(buf);
159 int height = atoi(buf);
162 if (atoi(buf) > UCHAR_MAX)
166 image<rgb> *im =
new image<rgb>(width, height);
167 file.read((
char *)imPtr(im, 0, 0), width * height *
sizeof(rgb));
172 static void savePPM(image<rgb> *im,
const char *name) {
173 int width = im->width();
174 int height = im->height();
175 std::ofstream file(name, std::ios::out | std::ios::binary);
177 file <<
"P6\n" << width <<
" " << height <<
"\n" << UCHAR_MAX <<
"\n";
178 file.write((
char *)imPtr(im, 0, 0), width * height *
sizeof(rgb));
182 void load_image(image<T> **im,
const char *name) {
186 std::ifstream file(name, std::ios::in | std::ios::binary);
188 if (strncmp(buf,
"VLIB", 9))
192 int width = atoi(buf);
194 int height = atoi(buf);
197 *im =
new image<T>(width, height);
198 file.read((
char *)imPtr((*im), 0, 0), width * height *
sizeof(T));
202 void save_image(image<T> *im,
const char *name) {
203 int width = im->width();
204 int height = im->height();
205 std::ofstream file(name, std::ios::out | std::ios::binary);
207 file <<
"VLIB\n" << width <<
" " << height <<
"\n";
208 file.write((
char *)imPtr(im, 0, 0), width * height *
sizeof(T));