public void getSOF(SOFInfo sof, UInt32 offset, UInt32 size) { if (!input.isValid(offset, size)) { throw new Exception("getSOF: Start offset plus size is longer than file. Truncated file."); } try { Endianness host_endian = Common.getHostEndianness(); // JPEG is big endian if (host_endian == Endianness.big) { input = new TIFFBinaryReader(input.BaseStream, offset, size); } else { input = new TIFFBinaryReaderRE(input.BaseStream, offset, size); } if (getNextMarker(false) != JpegMarker.M_SOI) { throw new Exception("getSOF: Image did not start with SOI. Probably not an LJPEG"); } while (true) { JpegMarker m = getNextMarker(true); if (JpegMarker.M_SOF3 == m) { parseSOF(sof); return; } if (JpegMarker.M_EOI == m) { throw new Exception("LJpegDecompressor: Could not locate Start of Frame."); } } } catch (IOException) { throw new Exception("LJpegDecompressor: IO exception, read outside file. Corrupt File."); } }
/* Check if the decoder can decode the image from this camera */ /* A RawDecoderException will be thrown if the camera isn't supported */ /* Unknown cameras does NOT generate any specific feedback */ /* This function must be overridden by actual decoders */ public void decodeUncompressed(ref IFD rawIFD, BitOrder order) { UInt32 nslices = rawIFD.getEntry(TagType.STRIPOFFSETS).dataCount; Tag offsets = rawIFD.getEntry(TagType.STRIPOFFSETS); Tag counts = rawIFD.getEntry(TagType.STRIPBYTECOUNTS); UInt32 yPerSlice = rawIFD.getEntry(TagType.ROWSPERSTRIP).getUInt(); Int32 width = rawIFD.getEntry(TagType.IMAGEWIDTH).getInt(); UInt32 height = rawIFD.getEntry(TagType.IMAGELENGTH).getUInt(); int bitPerPixel = rawIFD.getEntry(TagType.BITSPERSAMPLE).getInt(); List <RawSlice> slices = new List <RawSlice>(); UInt32 offY = 0; for (UInt32 s = 0; s < nslices; s++) { RawSlice slice = new RawSlice() { offset = (uint)offsets.data[s], count = (uint)counts.data[s] }; if (offY + yPerSlice > height) { slice.h = height - offY; } else { slice.h = yPerSlice; } offY += yPerSlice; if (mFile.isValid(slice.offset, slice.count)) // Only decode if size is valid { slices.Add(slice); } } if (0 == slices.Count) { throw new RawDecoderException("RAW Decoder: No valid slices found. File probably truncated."); } mRaw.dim.x = width; mRaw.dim.y = (int)offY; mRaw.whitePoint = (uint)(1 << bitPerPixel) - 1; offY = 0; for (int i = 0; i < slices.Count; i++) { RawSlice slice = slices[i]; var stream = mFile.BaseStream; TIFFBinaryReader input; if (mFile is TIFFBinaryReaderRE) { input = new TIFFBinaryReaderRE(mFile.BaseStream, slice.offset, slice.count); } else { input = new TIFFBinaryReader(mFile.BaseStream, slice.offset, slice.count); } iPoint2D size = new iPoint2D(width, (int)slice.h); iPoint2D pos = new iPoint2D(0, (int)offY); bitPerPixel = (int)(slice.count * 8u / (slice.h * width)); try { readUncompressedRaw(ref input, size, pos, width * bitPerPixel / 8, bitPerPixel, order); } catch (RawDecoderException) { if (i > 0) { //TODO add something } else { throw; } } catch (IOException e) { if (i > 0) { //TODO add something } else { throw new RawDecoderException("RAW decoder: IO error occurred in first slice, unable to decode more. Error is: " + e); } } offY += slice.h; } }