web-dev-qa-db-de.com

Wie schneidet man UIImage auf eine ovale oder kreisförmige Form?

Bitte geben Sie Anregungen, wie Sie UIImage auf ovale Form oder Kreisform beschneiden können. Bitte teilen Sie Ihre Ideen.

38
ram
#import <QuartzCore/QuartzCore.h>

CALayer *imageLayer = YourImageview.layer;
        [imageLayer setCornerRadius:5];
        [imageLayer setBorderWidth:1];
        [imageLayer setMasksToBounds:YES];

mit zunehmendem Radius wird es runder.

Solange das Bild ein Quadrat ist, können Sie einen perfekten Kreis erhalten, indem Sie die Hälfte des Eckradius annehmen: 

[imageView.layer setCornerRadius:imageView.frame.size.width/2]; 

Sie müssen auch hinzufügen

[imageView.layer setMasksToBounds:YES];

Swift 4.2

import QuartzCore

var imageLayer: CALayer? = YourImageview.layer
imageLayer?.cornerRadius = 5
imageLayer?.borderWidth = 1
imageLayer?.masksToBounds = true
109
Rakesh Bhatt

Ich habe vor ein paar Wochen angefangen, mir das anzuschauen. Ich habe alle Vorschläge ausprobiert, von denen keiner gut funktioniert hat. In der großen Tradition von RTFM habe ich Apple-Dokumentation über Quartz 2D Programming gelesen und habe mir das ausgedacht. Bitte probieren Sie es aus und lassen Sie mich wissen, wie es Ihnen geht.

Der Code kann relativ leicht geändert werden, um eine Elipse oder eine andere durch einen Pfad definierte Form zu beschneiden.

Stellen Sie sicher, dass Sie Quartz 2D in Ihr Projekt aufnehmen.

#include <math.h>

+ (UIImage*)circularScaleAndCropImage:(UIImage*)image frame:(CGRect)frame {
    // This function returns a newImage, based on image, that has been:
    // - scaled to fit in (CGRect) rect
    // - and cropped within a circle of radius: rectWidth/2

    //Create the bitmap graphics context
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(frame.size.width, frame.size.height), NO, 0.0);
    CGContextRef context = UIGraphicsGetCurrentContext();

    //Get the width and heights
    CGFloat imageWidth = image.size.width;
    CGFloat imageHeight = image.size.height;
    CGFloat rectWidth = frame.size.width;
    CGFloat rectHeight = frame.size.height;

    //Calculate the scale factor
    CGFloat scaleFactorX = rectWidth/imageWidth;
    CGFloat scaleFactorY = rectHeight/imageHeight;

    //Calculate the centre of the circle
    CGFloat imageCentreX = rectWidth/2;
    CGFloat imageCentreY = rectHeight/2;

    // Create and CLIP to a CIRCULAR Path
    // (This could be replaced with any closed path if you want a different shaped clip)
    CGFloat radius = rectWidth/2;
    CGContextBeginPath (context);
    CGContextAddArc (context, imageCentreX, imageCentreY, radius, 0, 2*M_PI, 0);
    CGContextClosePath (context);
    CGContextClip (context);

    //Set the SCALE factor for the graphics context
    //All future draw calls will be scaled by this factor
    CGContextScaleCTM (context, scaleFactorX, scaleFactorY);    

    // Draw the IMAGE
    CGRect myRect = CGRectMake(0, 0, imageWidth, imageHeight);
    [image drawInRect:myRect];

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}

Fügen Sie der UIView-Klasse den folgenden Code hinzu, der "monk2.png" durch Ihren eigenen Bildnamen ersetzt.

- (void)drawRect:(CGRect)rect {

    UIImage *originalImage = [UIImage imageNamed:[NSString stringWithFormat:@"monk2.png"]];
    CGFloat oImageWidth = originalImage.size.width;
    CGFloat oImageHeight = originalImage.size.height;
    // Draw the original image at the Origin
    CGRect oRect = CGRectMake(0, 0, oImageWidth, oImageHeight);
    [originalImage drawInRect:oRect];

    // Set the newRect to half the size of the original image 
    CGRect newRect = CGRectMake(0, 0, oImageWidth/2, oImageHeight/2);
    UIImage *newImage = [self circularScaleAndCropImage:originalImage frame:newRect];

    CGFloat nImageWidth = newImage.size.width;
    CGFloat nImageHeight = newImage.size.height;

    //Draw the scaled and cropped image
    CGRect thisRect = CGRectMake(oImageWidth+10, 0, nImageWidth, nImageHeight);
    [newImage drawInRect:thisRect];

}
36
Chris Nelson

ImageView in ovaler Form zu haben, ist nicht schwierig.

Sie können folgendes tun

UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:yourImageView.bounds];
CAShapeLayer *maskLayer = [CAShapeLayer layer]; 
maskLayer.path = path.CGPath;
yourImageView.layer.mask = maskLayer;

Wenn das an bezierPathWithOvalInRect übergebene Rechteck Quadrat ist, wird das Bild auf den Kreis zugeschnitten.

SWIFT-Code  

let path = UIBezierPath(ovalIn: yourImageView.bounds)
let maskLayer = CAShapeLayer()
maskLayer.path = path.cgPath
yourImageView.layer.mask = maskLayer
11
Mohammad Sadiq

Nach langer Suche habe ich den richtigen Weg gefunden, das Bild zu umkreisen 

Laden Sie die Support-Archivdatei unter URL http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/ herunter.

#import "UIImage+RoundedCorner.h"
#import "UIImage+Resize.h"

Die folgenden Zeilen werden zum Ändern der Bildgröße und zum Konvertieren in einen Radius verwendet

UIImage *mask = [UIImage imageNamed:@"mask.jpg"];

mask = [mask resizedImage:CGSizeMake(47, 47) interpolationQuality:kCGInterpolationHigh ];
mask = [mask roundedCornerImage:23.5 borderSize:1];
3
Dilip Rajkumar

Swift

var vwImage = UIImageView(image: UIImage(named: "Btn_PinIt_Normal.png"))
vwImage.frame = CGRectMake(0, 0, 100, 100)
vwImage.layer.cornerRadius = vwImage.frame.size.width/2
3
pkc456

So erstellen Sie ein RoundShape-Bild

Schritt1: in .h Datei

@property (strong, nonatomic) IBOutlet UIImageView *songImage;

Schritt2: in .m Datei

- (void)viewDidLoad
{
    self.songImage.layer.cornerRadius = self.songImage.frame.size.width / 2;
    self.songImage.clipsToBounds = YES;

     //To give the Border and Border color of imageview

   self.songImage.layer.borderWidth = 1.0f;
   self.songImage.layer.borderColor = [UIColor colorWithRed:249/255.0f green:117/255.0f blue:44/255.0f alpha:1.0f].CGColor;

}

OR für Swift

cell.songImage.layer.cornerRadius = cell.songImage.frame.size.width / 2;
cell.songImage.clipsToBounds = true

//To give the Border and Border color of imageview
cell.songImage.layer.borderWidth = 1.0
cell.songImage.layer.borderColor = UIColor(red: 50.0/255, green: 150.0/255, blue: 65.0/255, alpha: 1.0).CGColor
3
Hardik Thakkar

Wenn Sie nur einen perfekten Kreis benötigen, kann es hilfreich sein, die Form von UIImageView zu ändern. Fügen Sie einfach das QuartzCore-Framework Ihrem Projekt hinzu und fügen Sie diese Codezeilen irgendwo im Lebenszyklus hinzu, bevor die imageView angezeigt wird:

#import <QuartzCore/QuartzCore.h>
.
.
.

//to crop your UIImageView to show only a circle
yourImageView.layer.cornerRadius = yourImageView.frame.size.width/2;
yourImageView.clipsToBounds = YES;
2
codeburn

Das sollte funktionieren, Versuchen Sie, den Code in viewDidLoad () einzufügen.

self.myImage.layer.cornerRadius = self.myImage.frame.size.width / 2;
self.myImage.clipsToBounds = YES;
0
Aditya Malviya

Check out CGImageCreateWithMask. Erstellen Sie eine Maske Ihrer ovalen Form und wenden Sie sie dann auf das Bild an.

0
EFC

Swift 3 Antwort kommt von @Mohammad Sadiq

let path = UIBezierPath.init(ovalIn: workingImgaeView.bounds)
let maskLayer = CAShapeLayer(layer: layer)
maskLayer.path = path.cgPath
workingImgaeView.layer.mask = maskLayer
0
Jerome

sie sollten Dies ...

// Create the image from a png file
UIImage *image = [UIImage imageNamed:@"prgBinary.jpg"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

// Get size of current image
CGSize size = [image size];

// Frame location in view to show original image
[imageView setFrame:CGRectMake(0, 0, size.width, size.height)];
[[self view] addSubview:imageView];
[imageView release];    

// Create rectangle that represents a cropped image  
// from the middle of the existing image
CGRect rect = CGRectMake(size.width / 4, size.height / 4 , 
(size.width / 2), (size.height / 2)); //oval logic goes here

// Create bitmap image from original image data,
// using rectangle to specify desired crop area
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rect);
UIImage *img = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef);

// Create and show the new image from bitmap data
imageView = [[UIImageView alloc] initWithImage:img];
[imageView setFrame:CGRectMake(0, 200, (size.width / 2), (size.height / 2))];
[[self view] addSubview:imageView];
[imageView release];
0
Maulik