//Determining the color of the current pixel on account of the given position: inside start/end pixels or outside them
        public Bitmap addColorToPixel(pixelInfo curPixelInfo, Bitmap curBitmap, List<Color> allColors, Encrypting curEncrypting)
        {
            bool noChange = false;
            int curIndex = curPixelInfo.i;
            if (curPixelInfo.startI > -1 && curIndex >= curPixelInfo.startI && curIndex <= curPixelInfo.endI)
            {
                noChange = true;
            }

            Color curColor = new Color();
            if (!noChange)
            {
                //The current pixel is randomly assigned
                curIndex = curPixelInfo.random.Next(0, allColors.Count - 1);

                while (IO.twoColorsAreEqual(allColors[curIndex], curEncrypting.curHashing.startColor)) //StartColor determines where the encrypted chunk starts/ends and thus cannot be used outside it
                {
                    curIndex = curPixelInfo.random.Next(0, allColors.Count - 1);
                }

                curColor = allColors[curIndex];
            }
            else
            {
                //This is part of the "encrypted chunk" and thus the pixels, as calculated so far, have to be added
                curPixelInfo.encryptedAdded = true;
                curIndex = curIndex - curPixelInfo.startI;
                curColor = curEncrypting.encryptedString[curIndex];

                if (curEncrypting.curHashing.startOffset.startOffsetCount == -1)
                {
                    //There is no offset; thus the color in the "offset position" cannot be curEncrypting.curHashing.startOffset.afterOffset
                    if (twoColorsAreEqual(curColor, curEncrypting.curHashing.startOffset.afterOffset) && !curEncrypting.curHashing.startOffset.replaceAfter.Value.IsEmpty)
                    {
                        if (curEncrypting.encryptingNumber > 0 && curIndex == curEncrypting.encryptingNumber + 1)
                        {
                            curColor = curEncrypting.curHashing.startOffset.replaceAfter.Value;
                        }
                    }
                }
            }

            curBitmap.SetPixel(curPixelInfo.x, curPixelInfo.y, curColor);

            return curBitmap;
        }
        //Method called by the one above to actually create the image
        private Bitmap createImage(int width, int height, Encrypting curEncrypting)
        {
            Hashing curHashing = curEncrypting.curHashing;
            List<Color> allColors = curHashing.charsVsColors.Values.ToList(); //Colors being considered in the current encryption: neither their number nor their order is kept constant

            curEncrypting = setBoundaryColors(curEncrypting); //Including the additional pixels surrounding the ones including the encrypted information

            //Accounting for the fact that the default size (500*500) is not enough to store all the required information
            int totSize = width * height;
            if (totSize < curHashing.curLength)
            {
                double ratio = Math.Ceiling(Math.Sqrt(Math.Ceiling((double)allColors.Count / curHashing.curLength)));
                height = Convert.ToInt32(Math.Ceiling(height * ratio));
                width = Convert.ToInt32(Math.Ceiling(width * ratio));
            }

            Bitmap outBitmap = new Bitmap(width, height);

            pixelInfo curPixel = new pixelInfo();

            //Determining the start/end pixels (where the encrypted string + additional info will be located)
            curPixel.startI = calculateStartI(width, height, curEncrypting);
            if (curEncrypting.encryptedString != null) curPixel.endI = curPixel.startI + curEncrypting.encryptedString.Count - 1;

            //Main loop populating the bitmap with all the pixels: ones containing encrypted information and all the other ones
            curPixel.i = -1;
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    curPixel.i = curPixel.i + 1;
                    curPixel.x = x;
                    curPixel.y = y;

                    outBitmap = addColorToPixel(curPixel, outBitmap, allColors, curEncrypting);
                }
            }

            return outBitmap;
        }