//*************************************************************************** #include <iostream.h> #include <fstream.h> #include <stdlib.h> #include <string.h> #include <math.h> #include "image.h" #include "utils.h" //*************************************************************************** #define BUF_SIZE 256 //*************************************************************************** int WriteToRGBFile(char *FileName, char *fmt, GrayImage &rI, GrayImage &gI, GrayImage &bI) { WriteToRGBFile(FileName, rI, gI, bI); char *tmpfile = convert_image_format(FileName, fmt); moveFile(tmpfile, FileName); return 0; } //*************************************************************************** int GrayImage::ReadRGBimageFromFile2(char *FileName, GrayImage *rI, GrayImage *gI, GrayImage *bI) { cout << "Reading RGB image from file \"" << FileName << "\":" << endl; char *tmpfile = convert_image_format(FileName, "ppm"); int rtn = ReadRGBimageFromFile(tmpfile, rI, gI, bI); deleteFile(tmpfile); return rtn; } //*************************************************************************** int GrayImage::ReadRGBimageFromFile(char *FileName, GrayImage *rI, GrayImage *gI, GrayImage *bI) { int i,j; char buf[BUF_SIZE]; ifstream inp(FileName); if (!inp) // Invalid FileName { cerr << "Invalid filename: \"" << FileName << "\" does not exist!!" << endl; exit(-1); } if (!strstr(FileName, "mytmp")) cout << "Reading RGB image from file \"" << FileName << "\":" << endl; inp.getline(magicNumber,BUF_SIZE); inp.getline(buf,BUF_SIZE); int buflen = strlen(buf); while (buf[0] == '#' || buflen < 2) { inp.getline(buf,BUF_SIZE); buflen = strlen(buf); } width = atoi(buf); height = atoi(strpbrk(buf, " \t")); numpixels = height*width; inp.getline(buf,BUF_SIZE); numLevels = atoi(buf); if (!allocateFlag) allocateMem( ); rI->Init(height, width, numLevels); gI->Init(height, width, numLevels); bI->Init(height, width, numLevels); numBits = (int) (log((double) (numLevels+2))/log(2.0)); cout << "[" << numBits << "-bit "; if (magicNumber[1] == '6' || magicNumber[1] == '3') // RGB image { unsigned char rgb[3]; if (magicNumber[1] == '6') // RAWBITs { cout << "RGB RAWBITs PPM format]"; for (i = 0; i < height; i++) for (j = 0; j < width; j++) { inp.read((char *) rgb,3); rI->p[i][j] = rgb[0]; gI->p[i][j] = rgb[1]; bI->p[i][j] = rgb[2]; p[i][j] = (unsigned char) (sqrt((double) (rgb[0]*rgb[0] + rgb[1]*rgb[1] + rgb[2]*rgb[2])) /sqrt(3.0)); } } else // ASCII { cout << "RGB ASCII PPM format]"; for (i = 0; i < height; i++) for (j = 0; j < width; j++) { int pix; for (int k = 0; k < 3; k++) { inp >> pix; rgb[k] = (unsigned char) pix; } rI->p[i][j] = rgb[0]; gI->p[i][j] = rgb[1]; bI->p[i][j] = rgb[2]; p[i][j] = (unsigned char) (sqrt((double) (rgb[0]*rgb[0] + rgb[1]*rgb[1] + rgb[2]*rgb[2])) /sqrt(3.0)); } } } else { cerr << "Not an RGB image!!" << endl; exit(-1); } inp.close(); cout << endl; cout << "Width = " << width << endl; cout << "Height = " << height << endl; cout << "Numpixels = " << numpixels << endl; numLevels = 255; rI->numLevels = gI->numLevels = bI->numLevels = numLevels; numBits = 8; rI->numBits = gI->numBits = bI->numBits = numBits; magicNumber[1] = '5'; rI->magicNumber[1] = gI->magicNumber[1] = bI->magicNumber[1] = magicNumber[1]; return 0; // No error encountered....successful completion } //*************************************************************************** int WriteToRGBFile(char *FileName, GrayImage &rI, GrayImage &gI, GrayImage &bI) { char buf[BUF_SIZE]; ofstream out(FileName); if (!out) return -1; // Invalid Filename int height = rI.height; int width = rI.width; cout << "Writing " << height << "x" << width << " (HxW) RGB image to file \"" << FileName << "\"..."; cout.flush(); out << "P6" << endl; // RGB RAWBITs format out << "# Created by GrayImage::WriteToRGBFile" << endl; out << width << " " << height << endl; out << rI.numLevels << endl; for (int i = 0; i < height; i++) for (int j = 0; j < width; j++) { out.write((char *) &rI.p[i][j],1); out.write((char *) &gI.p[i][j],1); out.write((char *) &bI.p[i][j],1); } out.close(); cout << "done!" << endl; return 0; // No error encountered....successful completion } //***************************************************************************