2

I use the function below to draw a string on an image. It words great for the most part when I draw a string using one color.

However I want to have a word be in a different color. For example I want to draw "This is a TEST", I want TEST to be red.

What accomplish this using this method?

        System.Drawing.Image newImg = new System.Drawing.Bitmap(500, 500);
        pictureBox1.Image = TextOverlay(newImg, "This is a TEST", this.Font, Color.Black, ContentAlignment.MiddleCenter, 0.6F);

I'm referring to this line of code and not the OverlayColor parameter:

        g.DrawString(OverlayText, f, b, rect, strFormat);

Here is the complete function:

    public static Bitmap TextOverlay(Image img, string OverlayText, Font OverlayFont, Color OverlayColor, System.Drawing.ContentAlignment Position, float PercentFill)
    {
        // create bitmap and graphics used for drawing
        // "clone" image but use 24RGB format
        Bitmap bmp = new Bitmap(img.Width, img.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
        Graphics g = Graphics.FromImage(bmp);
        g.DrawImage(img, 0, 0);

        int alpha = 255;

        // Create the brush based on the color and alpha
        SolidBrush b = new SolidBrush(Color.FromArgb(alpha, OverlayColor));

        // Measure the text to render (unscaled, unwrapped)
        StringFormat strFormat = StringFormat.GenericTypographic;
        SizeF s = g.MeasureString(OverlayText, OverlayFont, 100000, strFormat);

        // Enlarge font to specified fill (estimated by AREA)
        float zoom = (float)(Math.Sqrt(((double)(img.Width * img.Height) * PercentFill) / (double)(s.Width * s.Height)));
        FontStyle sty = OverlayFont.Style;
        Font f = new Font(OverlayFont.FontFamily, ((float)OverlayFont.Size) * zoom, sty);

        int charFit;
        int linesFit;
        float SQRTFill = (float)(Math.Sqrt(PercentFill));
        strFormat.FormatFlags = StringFormatFlags.NoClip; //|| StringFormatFlags.LineLimit || StringFormatFlags.MeasureTrailingSpaces;
        strFormat.Trimming = StringTrimming.Word;
        SizeF layout = new SizeF(((float)img.Width) * SQRTFill, ((float)img.Height) * 1.5F); // fit to width, allow height to go over
        s = g.MeasureString(OverlayText, f, layout, strFormat, out charFit, out linesFit);

        // Determine draw area based on placement
        RectangleF rect = new RectangleF((bmp.Width - s.Width) / 2F,
                    (bmp.Height - s.Height) / 2F,
                    layout.Width,
                    ((float)img.Height) * SQRTFill);

        // Add rendering hint (thx to Thomas)
        g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;

        // finally, draw centered text!
        g.DrawString(OverlayText, f, b, rect, strFormat);

        // clean-up
        g.Dispose();
        b.Dispose();
        f.Dispose();

        return bmp;
    }
Kathy Judd
  • 715
  • 3
  • 9
  • 21
  • 2
    This looks like the same question you deleted earlier. You have to measure your black string to get the width and then draw your red string by that offset. – LarsTech Sep 18 '14 at 23:22
  • I had to rewrite it because it seams like people didn't understand what I was asking. Seamed like they were quick to judge were thinking I was asking about the parameter I was passing in. – Kathy Judd Sep 19 '14 at 14:17

0 Answers0