diff --git a/cs677/pa3/edge-detect.cc b/cs677/pa3/edge-detect.cc index 88dbe9f..98c7706 100644 --- a/cs677/pa3/edge-detect.cc +++ b/cs677/pa3/edge-detect.cc @@ -5,6 +5,10 @@ #include "BMP.h" using namespace std; +void usage(const char * progName); +void squashAndPadData(unsigned char * raw_data, unsigned char * padded_data, + int width, int height); + void usage(const char * progName) { cout << "Usage: " << progName << " [options] " << endl; @@ -20,9 +24,6 @@ int main(int argc, char * argv[]) string outputFileName; unsigned int threshold_level = 60; - if (argc < 2) - usage(argv[0]); - for (argi = 0; argi < argc; argi++) { if (!strcmp(argv[argi], "-l")) @@ -40,23 +41,41 @@ int main(int argc, char * argv[]) } } + if (inputFileName == "") + usage(argv[0]); BMP inputImage(inputFileName.c_str()); - unsigned char * data = - new unsigned char[inputImage.getWidth() * inputImage.getHeight() * 3]; - inputImage.read(data); + int width = inputImage.getWidth(); + int height = inputImage.getHeight(); + int num_pixels = width * height; + unsigned char * bmp_data = + new unsigned char[num_pixels * 3]; + inputImage.read(bmp_data); - unsigned char * data_ptr = data; - for (int i = 0; i < inputImage.getWidth() * inputImage.getHeight(); i++) - { - *data_ptr++ = 0; - *data_ptr++ = 0; - data_ptr++; - } + unsigned char * padded_data = + new unsigned char[(width + 2) * (height + 2)]; + squashAndPadData(bmp_data, padded_data, width, height); + delete[] bmp_data; - BMP edges(outputFileName.c_str(), - inputImage.getWidth(), - inputImage.getHeight(), - data); - delete[] data; + delete[] padded_data; } + +void squashAndPadData(unsigned char * raw_data, unsigned char * padded_data, + int width, int height) +{ + for (int i = 0; i < width + 2; i++) + *padded_data++ = 0; + for (int i = 0; i < height; i++) + { + *padded_data++ = 0; + for (int j = 0; j < width; j++) + { + *padded_data++ = (raw_data[0] + raw_data[1] + raw_data[2]) / 3; + raw_data += 3; + } + *padded_data++ = 0; + } + for (int i = 0; i < width + 2; i++) + *padded_data++ = 0; +} +