public void Compress(IRawImage source, Stream output)
{
if (source == null)
throw new ArgumentNullException("source");
if (output == null)
throw new ArgumentNullException("output");
m_compressor.Image_width = source.Width;
m_compressor.Image_height = source.Height;
m_compressor.In_color_space = (J_COLOR_SPACE)source.Colorspace;
m_compressor.Input_components = source.ComponentsPerPixel;
//m_compressor.Data_precision = source.DataPrecision;
m_compressor.jpeg_set_defaults();
//we need to set density parameters after setting of default jpeg parameters
//m_compressor.Density_unit = source.DensityUnit;
//m_compressor.X_density = (short)source.DensityX;
//m_compressor.Y_density = (short)source.DensityY;
applyParameters(m_compressionParameters);
// Specify data destination for compression
m_compressor.jpeg_stdio_dest(output);
// Start compression
m_compressor.jpeg_start_compress(true);
// Process pixels
source.BeginRead();
while (m_compressor.Next_scanline < m_compressor.Image_height)
{
byte[] row = source.GetPixelRow();
if (row == null)
throw new InvalidDataException("Row of pixels is null");
byte[][] rowForDecompressor = new byte[1][];
rowForDecompressor[0] = row;
m_compressor.jpeg_write_scanlines(rowForDecompressor, 1);
}
source.EndRead();
// Finish compression and release memory
m_compressor.jpeg_finish_compress();
}