如何使用MonoTouch以编程方式将某些文本添加到静态图像?

时间:2014-03-21 06:55:25

标签: ios image-processing xamarin.ios xamarin

我的静态图片大小为1024 * 768,一面有一些徽标,

我希望在该图像中添加一些文字,例如:Page 1,(另一方面)

我从

获得了一些代码
public override void ViewDidLoad ()
    {
        try {
            base.ViewDidLoad ();
            UIImage ii = new UIImage (Path.Combine (NSBundle.MainBundle.BundleUrl.ToString ().Replace ("%20", " ").Replace ("file://", ""), "images2.png"));

            RectangleF wholeImageRect = new RectangleF (0, 0, ii.CGImage.Width, ii.CGImage.Height);
            imageView = new UIImageView (wholeImageRect);
            this.View.AddSubview (imageView);

            imageView.Image = DrawVerticalText ("Trail Text", 100, 100);
            Console.Write ("Switch to Simulator now to see ");
            Console.WriteLine ("some stupid graphics tricks");
        } catch (Exception ex) {

        }
    }

public static UIImage DrawVerticalText (string text, int width, int height)
    {
        try {
            float centerX = width / 2;
            float centerY = height / 2;

            //Create the graphics context
            byte[] mybyteArray;
            CGImage tt = null;
            UIImage ii = new UIImage (Path.Combine (NSBundle.MainBundle.BundleUrl.ToString ().Replace ("%20", " ").Replace ("file://", ""), "images2.png"));
            using (NSData imagedata = ii.AsPNG ()) {
                mybyteArray = new byte[imagedata.Length];
                System.Runtime.InteropServices.Marshal.Copy (imagedata.Bytes, mybyteArray, 0, Convert.ToInt32 (imagedata.Length));
                using (CGBitmapContext ctx = new CGBitmapContext (mybyteArray, width, height, 8, 4 * width, CGColorSpace.CreateDeviceRGB (), CGImageAlphaInfo.PremultipliedFirst)) {
                    //Set the font
                    ctx.SelectFont ("Arial", 16f, CGTextEncoding.MacRoman);

                    //Measure the text's width - This involves drawing an invisible string to calculate the X position difference
                    float start, end, textWidth;

                    //Get the texts current position
                    start = ctx.TextPosition.X; 
                    //Set the drawing mode to invisible
                    ctx.SetTextDrawingMode (CGTextDrawingMode.Invisible);
                    //Draw the text at the current position
                    ctx.ShowText (text);
                    //Get the end position
                    end = ctx.TextPosition.X;
                    //Subtract start from end to get the text's width
                    textWidth = end - start;

                    //Set the fill color to blue
                    ctx.SetRGBFillColor (0f, 0f, 1f, 1f);

                    //Set the drawing mode back to something that will actually draw Fill for example
                    ctx.SetTextDrawingMode (CGTextDrawingMode.Fill);

                    //Set the text rotation to 90 degrees - Vertical from bottom to top.
                    ctx.TextMatrix = CGAffineTransform.MakeRotation ((float)(360 * 0.01745329f));
                    //Draw the text at the center of the image.
                    ctx.ShowTextAtPoint (2, 2, text);
                    tt = ctx.ToImage ();
                }
            }
            //Return the image
            return UIImage.FromImage (tt);

        } catch (Exception ex) {
            return new UIImage (Path.Combine (NSBundle.MainBundle.BundleUrl.ToString ().Replace ("%20", " ").Replace ("file://", ""), "images2.png"));
        }
    }

我得到的输出如下

out put of above code

正如你所看到的那样,它在宽度方面得到了完全拉伸,我需要这个解决任何建议???

同时原始图像上部没有任何内容,处理后显示多色图层,如何修复?

1 个答案:

答案 0 :(得分:0)

为什么不直接在图像上绘制文字?也许你可以试试这个:

    private static UIImage PutTextOnImage(UIImage image, string text, float x, float y)
    {
        UIGraphics.BeginImageContext(new CGSize(image.Size.Width, image.Size.Height)); 
        using (CGContext context = UIGraphics.GetCurrentContext())
        {
            // Copy original image
            var rect = new CGRect(0, 0, image.Size.Width, image.Size.Height);
            context.SetFillColor(UIColor.Black.CGColor);
            image.Draw(rect);

            // Use ScaleCTM to correct upside-down imaging
            context.ScaleCTM(1f, -1f);

            // Set the fill color for the text
            context.SetTextDrawingMode(CGTextDrawingMode.Fill);
            context.SetFillColor(UIColor.FromRGB(255, 0, 0).CGColor);

            // Draw the text with textSize
            var textSize = 20f;
            context.SelectFont("Arial", textSize, CGTextEncoding.MacRoman);
            context.ShowTextAtPoint(x, y, text);
        }

        // Get the resulting image from context
        var resultImage = UIGraphics.GetImageFromCurrentImageContext();
        UIGraphics.EndImageContext();

        return resultImage;
    }

上述方法使用给定的颜色和文本大小在coords x,y处绘制文本。如果您想垂直放置,则需要使用rotateCTM旋转文本。请记住,rotateCTM使用radius。

将此添加到您使用的Context块(在DrawTextAtPoint之前):

var angle = 90;    
var radius = 90 * (nfloat)Math.PI / 180;
context.RotateCTM(radius);