public void IndexedPixelsCollectionException() { ReportStart(); _pa = new PixelAnalysis( MakeBitmap( 10 ), QuantizerType.NeuQuant ); _pa.Analyse(); try { Assert.IsNull( _pa.IndexedPixelsCollection ); } catch( InvalidOperationException ex ) { string message = "The PixelAnalysis object was instantiated using the " + "constructor which accepts a single image and you " + "are attempting to retrieve the indexed pixels for a " + "collection of images. " + "Call the IndexedPixels property instead."; StringAssert.Contains( message, ex.Message ); ReportEnd(); throw; } }
private void TestMultipleImages( int numberOfColours ) { _images.Add( MakeBitmap( numberOfColours ) ); _images.Add( MakeBitmap( numberOfColours ) ); _pa = new PixelAnalysis( _images ); _pa.Analyse(); CheckColourTable( numberOfColours ); CheckIndexedPixelsCollection( numberOfColours ); }
private void TestSingleImage( int numberOfColours, QuantizerType qt ) { Bitmap image = MakeBitmap( numberOfColours ); _pa = new PixelAnalysis( image, qt ); _pa.Analyse(); CheckColourTable( numberOfColours ); CheckIndexedPixels( numberOfColours ); }
public void SingleImage257ColoursOctree() { ReportStart(); Bitmap image = MakeBitmap( 257 ); _pa = new PixelAnalysis( image, QuantizerType.Octree ); _pa.Analyse(); // FIXME: Octree quantizer is quantizing too much - reducing to 128 colours instead of 256 // TODO: Check for exactly 256 colours once Octree quantizer returns 256-colour images // Assert.AreEqual( 256, _pa.ColourTable.Length ); Assert.LessOrEqual( _pa.ColourTable.Length, 256 ); Assert.AreEqual( image.Width * image.Height, _pa.IndexedPixels.Count ); ReportEnd(); }
public void SingleImage257ColoursNeuQuant() { ReportStart(); Bitmap image = MakeBitmap( 257 ); _pa = new PixelAnalysis( image, QuantizerType.NeuQuant ); _pa.Analyse(); Assert.AreEqual( 256, _pa.ColourTable.Length ); Assert.AreEqual( image.Width * image.Height, _pa.IndexedPixels.Count ); ReportEnd(); }
public void MultipleImages257Colours() { ReportStart(); _images.Add( MakeBitmap( 257 ) ); _images.Add( MakeBitmap( 257 ) ); _pa = new PixelAnalysis( _images ); _pa.Analyse(); // Cannot use the TestMultipleImages method this time because using // more than 256 colours causes colour quantization to reduce it // to 256 colours. Exact contents of colour table and indexed pixels // are therefore unpredictable - we can only check their lengths. Assert.AreEqual( 256, _pa.ColourTable.Length ); Assert.AreEqual( 2, _pa.IndexedPixelsCollection.Count ); Assert.AreEqual( _images[0].Width * _images[0].Height, _pa.IndexedPixelsCollection[0].Count ); Assert.AreEqual( _images[1].Width * _images[1].Height, _pa.IndexedPixelsCollection[1].Count ); ReportEnd(); }
/// <summary> /// Writes a Logical Screen Descriptor to the supplied stream. /// Also writes a global colour table if required. /// </summary> /// <param name="outputStream"> /// The stream to write to. /// </param> private void WriteLogicalScreenDescriptor( Stream outputStream ) { bool hasGlobalColourTable = _strategy == ColourTableStrategy.UseGlobal; int colourResolution = 7; // TODO: parameterise colourResolution? bool globalColourTableIsSorted = false; // Sorting of colour tables is not currently supported int backgroundColorIndex = 0; // TODO: parameterise backgroundColourIndex? int pixelAspectRatio = 0; // TODO: parameterise pixelAspectRatio? if( _strategy == ColourTableStrategy.UseGlobal ) { if( _quantizerType == QuantizerType.UseSuppliedPalette ) { // use supplied palette _globalColourTable = new ColourTable(); string buildColourTableCounterText = "Building colour table from supplied palette"; AddCounter( buildColourTableCounterText, _palette.Count ); int paletteIndex = 0; foreach( Color c in _palette ) { _globalColourTable.Add( c ); MyProgressCounters[buildColourTableCounterText].Value = paletteIndex; paletteIndex++; } _globalColourTable.Pad(); RemoveCounter( buildColourTableCounterText ); } else { // Analyse the pixels in all the images to build the // global colour table. Collection<Image> images = new Collection<Image>(); foreach( GifFrame thisFrame in _frames ) { Image thisImage = thisFrame.TheImage; images.Add( thisImage ); } _pixelAnalysis = new PixelAnalysis( images ); _pixelAnalysis.ColourQuality = _quality; _pixelAnalysis.Analyse(); _globalColourTable = _pixelAnalysis.ColourTable; } LogicalScreenDescriptor lsd = new LogicalScreenDescriptor( _logicalScreenSize, hasGlobalColourTable, colourResolution, globalColourTableIsSorted, _globalColourTable.SizeBits, backgroundColorIndex, pixelAspectRatio ); lsd.WriteToStream( outputStream ); _globalColourTable.WriteToStream( outputStream ); } else { LogicalScreenDescriptor lsd = new LogicalScreenDescriptor( _logicalScreenSize, hasGlobalColourTable, colourResolution, globalColourTableIsSorted, 7, backgroundColorIndex, pixelAspectRatio ); lsd.WriteToStream( outputStream ); } }
private ColourTable SetActiveColourTable() { ColourTable act; // active colour table if( _strategy == ColourTableStrategy.UseLocal ) { if( _quantizerType == QuantizerType.UseSuppliedPalette ) { if( _frames[_encodingFrame].Palette == null ) { // TESTME: SetActiveColourTable - SetActiveColourTable, UseSuppliedPalette, no palette supplied string message = "You have opted to use a local colour table built " + "from a supplied palette, but frame " + _encodingFrame + "does not have a palette."; throw new InvalidOperationException( message ); } else { // Build local colour table from colours in the frame's // supplied palette. act = new ColourTable(); foreach( Color c in _frames[_encodingFrame].Palette ) { act.Add( c ); } act.Pad(); } } else { // Build local colour table based on colours in the image. Image thisImage = _frames[_encodingFrame].TheImage; _pixelAnalysis = new PixelAnalysis( thisImage, _quantizerType ); _pixelAnalysis.ColourQuality = _quality; _pixelAnalysis.Analyse(); // make local colour table active act = _pixelAnalysis.ColourTable; } } else { // make global colour table active act = _globalColourTable; } return act; }