/// Reset everything to initial state /// void init () { if (m_stream) { m_stream->Close (); delete m_stream; m_stream = NULL; } m_userBuf.clear (); }
OIIO_PLUGIN_EXPORTS_END bool DPXInput::valid_file (const std::string &filename) const { InStream *stream = new InStream(); if (! stream) return false; bool ok = false; if (stream->Open(filename.c_str())) { dpx::Reader dpx; dpx.SetInStream(stream); ok = dpx.ReadHeader(); stream->Close(); } delete stream; return ok; }
int main(int argc, char **argv) { int offset = 1; bool write8bit = false; //bool write8bit = true; if (argc == 4 && strcmp(argv[1], "-8") == 0) { write8bit = true; offset++; } else if (argc != 3) { Usage(); return 1; } // open the image InStream img; if (!img.Open(argv[offset])) { cout << "Unable to open file " << argv[1] << endl; return 1; } dpx::Reader dpx; dpx.SetInStream(&img); if (!dpx.ReadHeader()) { cout << "Unable to read header" << endl; return 2; } TIFF *out; out = TIFFOpen(argv[offset+1], "w"); if (out == NULL) { cout << "Unable to open output file" << endl; return 3; } // data size, override if user specifies dpx::DataSize size = dpx.header.ComponentDataSize(0); int nob = dpx.header.ComponentByteCount(0); if (write8bit) { size = dpx::kByte; nob = 1; } cout << "Image Width " << dpx.header.Width() << " Height " << dpx.header.Height() << " component byte count " << dpx.header.ComponentByteCount(0) << endl; // conversion int format = PHOTOMETRIC_RGB; int elementCount = 3; if (dpx.header.ImageElementComponentCount(0) == 1) { format = PHOTOMETRIC_MINISBLACK; elementCount = 1; } TIFFSetField(out, TIFFTAG_IMAGEWIDTH, (uint32) dpx.header.Width()); TIFFSetField(out, TIFFTAG_IMAGELENGTH, (uint32) dpx.header.Height()); TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, (uint32) nob * 8); TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, elementCount); TIFFSetField(out, TIFFTAG_COMPRESSION, COMPRESSION_NONE); TIFFSetField(out, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); TIFFSetField(out, TIFFTAG_PHOTOMETRIC, format); TIFFSetField(out, TIFFTAG_MINSAMPLEVALUE, 0); int max = 0xff; if (nob == 2) max = 0xffff; else max = 0xffffffff; TIFFSetField(out, TIFFTAG_MAXSAMPLEVALUE, max); tdata_t buf = _TIFFmalloc(TIFFScanlineSize(out)); if (buf == NULL) { cout << "memory allocation error" << endl; return 4; } Block block(0, 0, dpx.header.Width()-1, 0); int y; for (y = 0; y < dpx.header.Height(); y++) { block.y1 = y; block.y2 = y; if (dpx.ReadBlock(buf, size, block, dpx.header.ImageDescriptor(0)) == false) { cout << "unable to read line " << y << " with component data size " << size << endl; return 5; } if (TIFFWriteScanline(out, buf, y, 0) < 0) { cout << "unable to write tiff scanline " << y << endl; return 6; } } _TIFFfree(buf); img.Close(); TIFFClose(out); return 0; }