2016-05-21 9 views
1

Ich versuche, ein Rechteck in der Mitte eines UIImage zu setzen Core Graphics verwenden, wie dies in etwa aussehen:Rechteck zeichnet Auf UIImage mit Core Graphics

enter image description here

Dies ist mein Code so weit:

func drawRectangleOnImage(image: UIImage) -> UIImage { 
    let imageSize = image.size 
    let scale: CGFloat = 0 
    UIGraphicsBeginImageContextWithOptions(imageSize, false, scale) 
    let context = UIGraphicsGetCurrentContext() 

    let rectangle = CGRect(x: 0, y: (imageSize.height/2) - 30, width: imageSize.width, height: 60) 

    CGContextSetFillColorWithColor(context, UIColor.blackColor().CGColor) 
    CGContextSetStrokeColorWithColor(context, UIColor.redColor().CGColor) 
    CGContextSetLineWidth(context, 5) 
    CGContextAddRect(context, rectangle) 
    CGContextDrawPath(context, .Fill) 

    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return newImage 
} 

Ich fühle mich, als ob es nicht auf das Bild, das ich gesendet habe, zeichnet, es schafft insgesamt ein neues Bild. Das Ganze wird rot, mit dem Rechteck schwarz. Ich möchte das schwarze Rechteck und der Rest sollte immer noch das gleiche wie das Bild sein.

Was mache ich falsch?

+1

ich das Bild in den Kontext nehme Zeichnung wäre ein guter Anfang sein;) – Hamish

Antwort

9

Ich fühle mich, als ob es nicht über das Bild, das ich gesendet habe, zeichnet, es schafft ein neues Bild zusammen.

Keine Gefühle beteiligt. Das ist buchstäblich, was dieser Code tut.

  1. Erstellt einen neuen Kontext
  2. ein Rechteck Zeichnet hinein
  3. ein Bild macht Kontext aus und gibt es

Zwischen den Schritten 1 und 2, müssen Sie Ihre ursprüngliche ziehen Bild in den Kontext.

Es ist auch nicht notwendig, die Linienbreite oder Strichfarbe festzulegen, da Sie nur das Rechteck ausfüllen und nicht streichen. (Wenn Sie aus irgendeinem Grund rot sehen, war es nicht wegen dieser Code, haben Sie eine andere Ansicht oder Bild, das einen roten Hintergrund hat?)

func drawRectangleOnImage(image: UIImage) -> UIImage { 
    let imageSize = image.size 
    let scale: CGFloat = 0 
    UIGraphicsBeginImageContextWithOptions(imageSize, false, scale) 
    let context = UIGraphicsGetCurrentContext() 

    image.drawAtPoint(CGPointZero) 

    let rectangle = CGRect(x: 0, y: (imageSize.height/2) - 30, width: imageSize.width, height: 60) 

    CGContextSetFillColorWithColor(context, UIColor.blackColor().CGColor) 
    CGContextAddRect(context, rectangle) 
    CGContextDrawPath(context, .Fill) 

    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return newImage 
} 

Und man könnte weiter vereinfachen, indem Sie höher- Ebene UIKit API zum Zeichnen.

func drawRectangleOnImage(image: UIImage) -> UIImage { 
    let imageSize = image.size 
    let scale: CGFloat = 0 
    UIGraphicsBeginImageContextWithOptions(imageSize, false, scale) 

    image.drawAtPoint(CGPointZero) 

    let rectangle = CGRect(x: 0, y: (imageSize.height/2) - 30, width: imageSize.width, height: 60) 

    UIColor.blackColor().setFill() 
    UIRectFill(rectangle) 

    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return newImage 
} 
0

Objective C-Version von Kurt Revis beantworten

-(UIImage *)drawRectangleOnImage:(UIImage *)img rect:(CGRect)rect{ 
     CGSize imgSize = img.size; 
     CGFloat scale = 0; 
     UIGraphicsBeginImageContextWithOptions(imgSize, NO, scale); 
     [img drawAtPoint:CGPointZero]; 
     [[UIColor greenColor] setFill]; 
     UIRectFill(rect); 
     UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
     return newImage; 
} 
Verwandte Themen