ScreenToGif.Encoding.NeuQuant.Map C# (CSharp) Method

Map() public method

Search for BGR values 0..255 (after net is unbiased) and return color index.
public Map ( int b, int g, int r ) : int
b int Blue
g int Green
r int Red
return int
        public int Map(int b, int g, int r)
        {
            int bestD = 1000;
            int best = -1;

            int i = _netIndex[g];
            int j = i - 1;

            while (i < Netsize || j >= 0)
            {
                int dist;
                int a;

                if (i < Netsize)
                {
                    dist = _network[i][1] - g; //Inx key.

                    if (dist >= bestD)
                        i = Netsize; //Stop iteration.
                    else
                    {
                        if (dist < 0)
                            dist = -dist;
                        a = _network[i][0] - b;

                        if (a < 0)
                            a = -a;
                        dist += a;

                        if (dist < bestD)
                        {
                            a = _network[i][2] - r;
                            if (a < 0)
                                a = -a;
                            dist += a;

                            if (dist < bestD)
                            {
                                bestD = dist;
                                best = _network[i][3];
                            }
                        }

                        i++;
                    }
                }

                if (j >= 0)
                {
                    dist = g - _network[j][1]; //Inx key - Reverse difference.

                    if (dist >= bestD)
                        j = -1; //Stop iteration.
                    else
                    {
                        if (dist < 0)
                            dist = -dist;
                        a = _network[j][0] - b;

                        if (a < 0)
                            a = -a;
                        dist += a;

                        if (dist < bestD)
                        {
                            a = _network[j][2] - r;

                            if (a < 0)
                                a = -a;

                            dist += a;

                            if (dist < bestD)
                            {
                                bestD = dist;
                                best = _network[j][3];
                            }
                        }

                        j--;
                    }
                }
            }

            return (best);
        }

Usage Example

Example #1
0
        /// <summary>
        /// Analyzes image colors and creates color map.
        /// </summary>
        private void AnalyzePixels()
        {
            int len  = _pixels.Length;
            int nPix = len / 3;

            _indexedPixels = new byte[nPix];

            //Initialize quantizer.
            var nq = new NeuQuant(_pixels, len, _sample);

            //Create reduced palette.
            _colorTab = nq.Process();

            #region BGR to RGB

            for (int i = 0; i < _colorTab.Length; i += 3)
            {
                //Only swap Red with Blue. Green stays.
                byte temp = _colorTab[i];
                _colorTab[i]      = _colorTab[i + 2];
                _colorTab[i + 2]  = temp;
                _usedEntry[i / 3] = false;
            }

            #endregion

            //Map image pixels to new palette.
            int k = 0;
            _usedEntry = new bool[256];

            for (int i = 0; i < nPix; i++)
            {
                int index = nq.Map(
                    _pixels[k++],
                    _pixels[k++],
                    _pixels[k++]);

                _usedEntry[index] = true;
                _indexedPixels[i] = (byte)index;
            }

            _colorDepth = 8;
            _palSize    = 7;

            //Get closest match to transparent color if specified.
            if (_transparent != Color.Empty)
            {
                _transIndex = nq.Map(_transparent.B, _transparent.G, _transparent.R);
            }

            _pixels = null;
        }
All Usage Examples Of ScreenToGif.Encoding.NeuQuant::Map