MStatus iffPpm::redoIt() { clearResult(); IFFimageReader reader; MStatus stat; stat = reader.open (fileName); IFFCHECKERR (stat, open); int imageWidth,imageHeight,bytesPerChannel; stat = reader.getSize (imageWidth,imageHeight); IFFCHECKERR (stat, getSize); bytesPerChannel = reader.getBytesPerChannel (); stat = reader.readImage (); IFFCHECKERR (stat, readImage); ofstream out (ppmFile.asChar ()); if (!out.good ()) { displayError ("Could not create output file"); return MS::kFailure; } out << "P3" << endl << imageWidth << " " << imageHeight << endl; if (useDepth) { if (!reader.hasDepthMap ()) { displayError ("Image has no depth map"); return MS::kFailure; } // Step 1: calculate the range of depth values in the data. // We'll normalize against this range. float minDepth=FLT_MAX, maxDepth=(-FLT_MAX); const float *depthMap = reader.getDepthMap (); for(int index=0; index<imageWidth*imageHeight; index++) { float depth=depthMap[index]; if (depth!=0.) // 0 values indicate nothing there { float realDepth= -1.0f/depth; if (realDepth<minDepth) minDepth=realDepth; if (realDepth>maxDepth) maxDepth=realDepth; } } // Step 2: output data, normalizing to 0-255 out << "255" << endl; float scaleFactor = (float) (255.0 / ((double)maxDepth - (double)minDepth)); float offset = minDepth * scaleFactor; const float *entry = depthMap; for(int y=0; y < imageHeight; y++) for(int x=0; x < imageWidth; x++, entry++) { if (*entry == 0.) out << "0 0 0" << endl; else { float realDepth = -scaleFactor / *entry - offset; out << (int)realDepth << " " << (int)realDepth << " " << (int) realDepth << endl; } } } else { if (!reader.isRGB () && !reader.isGrayscale ()) { displayError ("Image has no RGB data"); return MS::kFailure; } if (bytesPerChannel==1) out << "255" << endl; else out << "65535" << endl; const byte *bitmap = reader.getPixelMap (); const byte *pixel = bitmap; int bytesPerPixel = (bytesPerChannel == 1) ? 4 : 8; for(int y=0; y < imageHeight; y++) for(int x=0; x < imageWidth; x++, pixel += bytesPerPixel) { // Note that if the image was greyscale then the ILload // function will have expanded the grey into rgb now. // if (bytesPerChannel==1) { #ifdef _WIN32 // The actual internal storage on NT is BGRA out << (int)pixel[2] << " " << (int)pixel[1] << " " << (int)pixel[0] << endl; #else // The actual internal storage on IRIX is ABGR out << (int)pixel[3] << " " << (int)pixel[2] << " " << (int)pixel[1] << endl; #endif } else // 16 bit { #ifdef _WIN32 out << ((int)pixel[4]<<8)+(int)pixel[5] << " " << ((int)pixel[2]<<8)+(int)pixel[3] << " " << ((int)pixel[0]<<8)+(int)pixel[1] << endl; #else out << ((int)pixel[6]<<8)+(int)pixel[7] << " " << ((int)pixel[4]<<8)+(int)pixel[5] << " " << ((int)pixel[2]<<8)+(int)pixel[3] << endl; #endif } } } IFFCHECKERR (stat, getPixel); stat = reader.close (); IFFCHECKERR (stat, close); return MS::kSuccess; }
MStatus iffPixel::doIt( const MArgList& args ) { MString componentName; if (args.length () < 3 || args.length () > 4) { displayError ("Syntax: iffPixel file x y [-depth]"); return MS::kFailure; } int x,y; MString fileName; args.get (0, fileName); args.get (1, x); args.get (2, y); if (args.length () == 4) { MString lastArg; args.get (3, lastArg); if (lastArg != MString ("-depth")) { displayError ("Syntax: iffPixel file x y [-depth]"); return MS::kFailure; } useDepth = true; } else useDepth = false; IFFimageReader reader; MStatus stat; stat = reader.open (fileName); IFFCHECKERR (stat, open); int w,h; stat = reader.getSize (w,h); IFFCHECKERR (stat, getSize); if (x < 0 || x > w || y < 0 || y > h) { MString message ("Co-ordinates out of range. Size of image is "); message += itoa (w); message += "+"; message += itoa (h); displayError (message); return MS::kFailure; } stat = reader.readImage (); IFFCHECKERR (stat, readImage); if (useDepth) { if (!reader.hasDepthMap ()) { displayError ("Image has no depth map"); return MS::kFailure; } stat = reader.getDepth (x,y,&d); } else { if (!reader.isRGB () && !reader.isGrayscale ()) { displayError ("Image has no RGB data"); return MS::kFailure; } stat = reader.getPixel (x,y,&r,&g,&b,&a); } IFFCHECKERR (stat, getPixel); stat = reader.close (); IFFCHECKERR (stat, close); return redoIt(); }