public TiffGrid(string FileName) { string fname = Path.GetFullPath(FileName); tiff = Tiff.Open(FileName, "r"); var val = tiff.GetField((TiffTag)33922)[1].ToDoubleArray(); XOrigin = val[3]; YOrigin = val[4]; //Upper basegrid assumes Lower val = tiff.GetField((TiffTag)33550)[1].ToDoubleArray(); GridSize = val[0]; GridSize = val[1]; NumberOfColumns = tiff.GetField(TiffTag.IMAGEWIDTH)[0].ToInt(); NumberOfRows = tiff.GetField(TiffTag.IMAGELENGTH)[0].ToInt(); scanline = new byte[tiff.ScanlineSize()]; bits = tiff.ScanlineSize() / NumberOfColumns; ScanLineCache = new Dictionary<int, byte[]>(); }
public TiffGrid(string filename, string NewFileName) { ValuesToWrite = new Dictionary<int, Dictionary<int, double>>(); tiff_org = BitMiracle.LibTiff.Classic.Tiff.Open(Path.GetFullPath(filename), "r"); tiff = BitMiracle.LibTiff.Classic.Tiff.Open(Path.GetFullPath(NewFileName), "w"); foreach (TiffTag enu in Enum.GetValues(typeof(TiffTag))) { var val = tiff_org.GetField(enu); if (val != null & enu != TiffTag.EXTRASAMPLES) tiff.SetField(enu, val[0]); } for (int i = 0; i < tiff_org.GetTagListCount(); i++) { int k = tiff_org.GetTagListEntry(i); var ff = tiff_org.FindFieldInfo((TiffTag)k, TiffType.ANY); tiff.MergeFieldInfo(new TiffFieldInfo[] { ff }, 1); var val = tiff_org.GetField((TiffTag)tiff_org.GetTagListEntry(i)); tiff.SetField((TiffTag)k, val[0], val[1]); } var val2 = tiff_org.GetField((TiffTag)33922)[1].ToDoubleArray(); XOrigin = val2[3]; YOrigin = val2[4]; //Upper basegrid assumes Lower val2 = tiff_org.GetField((TiffTag)33550)[1].ToDoubleArray(); GridSize = val2[0]; GridSize = val2[1]; NumberOfColumns = tiff_org.GetField(TiffTag.IMAGEWIDTH)[0].ToInt(); NumberOfRows = tiff_org.GetField(TiffTag.IMAGELENGTH)[0].ToInt(); //Shift YOrigin to lower left YOrigin -= GridSize * NumberOfRows; scanline = new byte[tiff_org.ScanlineSize()]; bits = scanline.Count() / NumberOfColumns; ScanLineCache = new Dictionary<int, byte[]>(); }
/* * Separate -> contig by row. */ bool cpSeparate2ContigByRow(Tiff inImage, Tiff outImage, int imagelength, int imagewidth, short spp) { byte[] inbuf = new byte[inImage.ScanlineSize()]; byte[] outbuf = new byte[outImage.ScanlineSize()]; for (int row = 0; row < imagelength; row++) { /* merge channels */ for (short s = 0; s < spp; s++) { if (!inImage.ReadScanline(inbuf, row, s) && !m_ignore) { Tiff.Error(inImage.FileName(), "Error, can't read scanline {0}", row); return false; } int inp = 0; int outp = s; for (int n = imagewidth; n-- > 0; ) { outbuf[outp] = inbuf[inp]; inp++; outp += spp; } } if (!outImage.WriteScanline(outbuf, row, 0)) { Tiff.Error(outImage.FileName(), "Error, can't write scanline {0}", row); return false; } } return true; }
/* * Separate -> separate by row for rows/strip change. */ bool cpSeparate2SeparateByRow(Tiff inImage, Tiff outImage, int imagelength, int imagewidth, short spp) { byte[] buf = new byte[inImage.ScanlineSize()]; for (short s = 0; s < spp; s++) { for (int row = 0; row < imagelength; row++) { if (!inImage.ReadScanline(buf, row, s) && !m_ignore) { Tiff.Error(inImage.FileName(), "Error, can't read scanline {0}", row); return false; } if (!outImage.WriteScanline(buf, row, s)) { Tiff.Error(outImage.FileName(), "Error, can't write scanline {0}", row); return false; } } } return true; }
/* * Contig -> contig by scanline while subtracting a bias image. */ bool cpBiasedContig2Contig(Tiff inImage, Tiff outImage, int imagelength, int imagewidth, short spp) { if (spp == 1) { int biasSize = m_bias.ScanlineSize(); int bufSize = inImage.ScanlineSize(); FieldValue[] result = m_bias.GetField(TiffTag.IMAGEWIDTH); int biasWidth = result[0].ToInt(); result = m_bias.GetField(TiffTag.IMAGELENGTH); int biasLength = result[0].ToInt(); if (biasSize == bufSize && imagelength == biasLength && imagewidth == biasWidth) { result = inImage.GetField(TiffTag.BITSPERSAMPLE); short sampleBits = result[0].ToShort(); if (sampleBits == 8 || sampleBits == 16 || sampleBits == 32) { byte[] buf = new byte[bufSize]; byte[] biasBuf = new byte[bufSize]; for (int row = 0; row < imagelength; row++) { if (!inImage.ReadScanline(buf, row, 0) && !m_ignore) { Tiff.Error(inImage.FileName(), "Error, can't read scanline {0}", row); return false; } if (!m_bias.ReadScanline(biasBuf, row, 0) && !m_ignore) { Tiff.Error(inImage.FileName(), "Error, can't read biased scanline {0}", row); return false; } if (sampleBits == 8) subtract8(buf, biasBuf, imagewidth); else if (sampleBits == 16) subtract16(buf, biasBuf, imagewidth); else if (sampleBits == 32) subtract32(buf, biasBuf, imagewidth); if (!outImage.WriteScanline(buf, row, 0)) { Tiff.Error(outImage.FileName(), "Error, can't write scanline {0}", row); return false; } } m_bias.SetDirectory(m_bias.CurrentDirectory()); /* rewind */ return true; } else { Tiff.Error(inImage.FileName(), "No support for biasing {0} bit pixels\n", sampleBits); return false; } } Tiff.Error(inImage.FileName(), "Bias image {0},{1}\nis not the same size as {2},{3}\n", m_bias.FileName(), m_bias.CurrentDirectory(), inImage.FileName(), inImage.CurrentDirectory()); return false; } else { Tiff.Error(inImage.FileName(), "Can't bias {0},{1} as it has >1 Sample/Pixel\n", inImage.FileName(), inImage.CurrentDirectory()); return false; } }
bool writeBufferToSeparateTiles(Tiff outImage, byte[] buf, int imagelength, int imagewidth, short spp) { byte[] obuf = new byte[outImage.TileSize()]; FieldValue[] result = outImage.GetField(TiffTag.TILELENGTH); int tl = result[0].ToInt(); result = outImage.GetField(TiffTag.TILEWIDTH); int tw = result[0].ToInt(); result = outImage.GetField(TiffTag.BITSPERSAMPLE); short bps = result[0].ToShort(); Debug.Assert(bps % 8 == 0); short bytes_per_sample = (short)(bps / 8); int imagew = outImage.ScanlineSize(); int tilew = outImage.TileRowSize(); int iimagew = outImage.RasterScanlineSize(); int iskew = iimagew - tilew * spp; int bufp = 0; for (int row = 0; row < imagelength; row += tl) { int nrow = (row + tl > imagelength) ? imagelength - row : tl; int colb = 0; for (int col = 0; col < imagewidth; col += tw) { for (short s = 0; s < spp; s++) { /* * Tile is clipped horizontally. Calculate * visible portion and skewing factors. */ if (colb + tilew > imagew) { int width = imagew - colb; int oskew = tilew - width; cpContigBufToSeparateBuf(obuf, buf, bufp + (colb * spp) + s, nrow, width / bytes_per_sample, oskew, (oskew * spp) + iskew, spp, bytes_per_sample); } else cpContigBufToSeparateBuf(obuf, buf, bufp + (colb * spp) + s, nrow, m_tilewidth, 0, iskew, spp, bytes_per_sample); if (outImage.WriteTile(obuf, col, row, 0, s) < 0) { Tiff.Error(outImage.FileName(), "Error, can't write tile at {0} {1} sample {2}", col, row, s); return false; } } colb += tilew; } bufp += nrow * iimagew; } return true; }
bool writeBufferToContigTiles(Tiff outImage, byte[] buf, int imagelength, int imagewidth, short spp) { byte[] obuf = new byte[outImage.TileSize()]; FieldValue[] result = outImage.GetField(TiffTag.TILELENGTH); int tl = result[0].ToInt(); result = outImage.GetField(TiffTag.TILEWIDTH); int tw = result[0].ToInt(); int imagew = outImage.ScanlineSize(); int tilew = outImage.TileRowSize(); int iskew = imagew - tilew; int bufp = 0; for (int row = 0; row < imagelength; row += m_tilelength) { int nrow = (row + tl > imagelength) ? imagelength - row : tl; int colb = 0; for (int col = 0; col < imagewidth; col += tw) { /* * Tile is clipped horizontally. Calculate * visible portion and skewing factors. */ if (colb + tilew > imagew) { int width = imagew - colb; int oskew = tilew - width; cpStripToTile(obuf, 0, buf, bufp + colb, nrow, width, oskew, oskew + iskew); } else cpStripToTile(obuf, 0, buf, bufp + colb, nrow, tilew, 0, iskew); if (outImage.WriteTile(obuf, col, row, 0, 0) < 0) { Tiff.Error(outImage.FileName(), "Error, can't write tile at {0} {1}", col, row); return false; } colb += tilew; } bufp += nrow * imagew; } return true; }
bool readContigTilesIntoBuffer(Tiff inImage, byte[] buf, int imagelength, int imagewidth, short spp) { byte[] tilebuf = new byte[inImage.TileSize()]; FieldValue[] result = inImage.GetField(TiffTag.TILEWIDTH); int tw = result[0].ToInt(); result = inImage.GetField(TiffTag.TILELENGTH); int tl = result[0].ToInt(); int imagew = inImage.ScanlineSize(); int tilew = inImage.TileRowSize(); int iskew = imagew - tilew; int bufp = 0; for (int row = 0; row < imagelength; row += tl) { int nrow = (row + tl > imagelength) ? imagelength - row : tl; int colb = 0; for (int col = 0; col < imagewidth; col += tw) { if (inImage.ReadTile(tilebuf, 0, col, row, 0, 0) < 0 && !m_ignore) { Tiff.Error(inImage.FileName(), "Error, can't read tile at {0} {1}", col, row); return false; } if (colb + tilew > imagew) { int width = imagew - colb; int oskew = tilew - width; cpStripToTile(buf, bufp + colb, tilebuf, 0, nrow, width, oskew + iskew, oskew); } else cpStripToTile(buf, bufp + colb, tilebuf, 0, nrow, tilew, iskew, 0); colb += tilew; } bufp += imagew * nrow; } return true; }
bool readSeparateStripsIntoBuffer(Tiff inImage, byte[] buf, int imagelength, int imagewidth, short spp) { int scanlinesize = inImage.ScanlineSize(); if (scanlinesize == 0) return false; byte[] scanline = new byte[scanlinesize]; int bufp = 0; for (int row = 0; row < imagelength; row++) { /* merge channels */ for (short s = 0; s < spp; s++) { if (!inImage.ReadScanline(scanline, row, s) && !m_ignore) { Tiff.Error(inImage.FileName(), "Error, can't read scanline {0}", row); return false; } int n = scanlinesize; int bp = s; int sbuf = 0; while (n-- > 0) { buf[bufp + bp] = scanline[sbuf]; sbuf++; bp += spp; } } bufp += scanlinesize * spp; } return true; }
bool readContigStripsIntoBuffer(Tiff inImage, byte[] buffer, int imagelength, int imagewidth, short spp) { int scanlinesize = inImage.ScanlineSize(); int offset = 0; for (int row = 0; row < imagelength; row++) { if (!inImage.ReadScanline(buffer, offset, row, 0) && !m_ignore) { Tiff.Error(inImage.FileName(), "Error, can't read scanline {0}", row); return false; } offset += scanlinesize; } return true; }
public TiffGrid(string FileName) { string fname = Path.GetFullPath(FileName); if (!File.Exists(fname)) return; tiff = BitMiracle.LibTiff.Classic.Tiff.Open(FileName, "r"); var val = tiff.GetField((TiffTag)33922)[1].ToDoubleArray(); XOrigin = val[3]; YOrigin = val[4]; //Upper basegrid assumes Lower val = tiff.GetField((TiffTag)33550)[1].ToDoubleArray(); GridSize = val[0]; GridSize = val[1]; NumberOfColumns = tiff.GetField(TiffTag.IMAGEWIDTH)[0].ToInt(); NumberOfRows = tiff.GetField(TiffTag.IMAGELENGTH)[0].ToInt(); //Shift YOrigin to lower left YOrigin -= GridSize * NumberOfRows; scanline = new byte[tiff.ScanlineSize()]; bits = scanline.Count() / NumberOfColumns; ScanLineCache = new Dictionary<int, byte[]>(); }
// convert tiff image to 2d byte array public static byte[,] Tiff2Array(Tiff image, int height, int width) { // store the image information in 2d byte array // reserve memory for storing the size of 1 line byte[] scanline = new byte[image.ScanlineSize()]; // reserve memory for the size of image byte[,] im = new byte[height, width]; for (int i = 0; i < height; i++) { image.ReadScanline(scanline, i); { for (int j = 0; j < width; j++) im[i, j] = scanline[j]; } } // end grabbing intensity values return im; }
/* This function returns the necessary size of a data buffer to contain the raw or uncompressed image data from the input TIFF for a page. */ private void read_tiff_size(Tiff input) { if (m_pdf_transcode == t2p_transcode_t.T2P_TRANSCODE_RAW) { FieldValue[] result = null; if (m_pdf_compression == t2p_compress_t.T2P_COMPRESS_G4) { result = input.GetField(TiffTag.STRIPBYTECOUNTS); int[] sbc = result[0].ToIntArray(); m_tiff_datasize = sbc[0]; return; } if (m_pdf_compression == t2p_compress_t.T2P_COMPRESS_ZIP) { result = input.GetField(TiffTag.STRIPBYTECOUNTS); int[] sbc = result[0].ToIntArray(); m_tiff_datasize = sbc[0]; return; } if (m_tiff_compression == Compression.JPEG) { result = input.GetField(TiffTag.JPEGTABLES); if (result != null) { int count = result[0].ToInt(); if (count > 4) { m_tiff_datasize += count; m_tiff_datasize -= 2; /* don't use EOI of header */ } } else { m_tiff_datasize = 2; /* SOI for first strip */ } int stripcount = input.NumberOfStrips(); int[] sbc = null; result = input.GetField(TiffTag.STRIPBYTECOUNTS); if (result == null) { Tiff.Error(Tiff2PdfConstants.TIFF2PDF_MODULE, "Input file {0} missing field: STRIPBYTECOUNTS", input.FileName()); m_error = true; return; } else sbc = result[0].ToIntArray(); for (int i = 0; i < stripcount; i++) { m_tiff_datasize += sbc[i]; m_tiff_datasize -= 4; /* don't use SOI or EOI of strip */ } m_tiff_datasize += 2; /* use EOI of last strip */ return; } } m_tiff_datasize = input.ScanlineSize() * m_tiff_length; if (m_tiff_planar == PlanarConfig.SEPARATE) m_tiff_datasize *= m_tiff_samplesperpixel; }