web-dev-qa-db-fra.com

Comment puis-je prendre un UIImage et lui donner une bordure noire?

Comment puis-je définir la bordure d'un UIImage?

121
Shay

Avec OS> 3.0, vous pouvez faire ceci:

//you need this import
#import <QuartzCore/QuartzCore.h>

[imageView.layer setBorderColor: [[UIColor blackColor] CGColor]];
[imageView.layer setBorderWidth: 2.0];
238
mclin

Vous pouvez le faire en créant une nouvelle image (également dans votre autre message de cette question):

- (UIImage*)imageWithBorderFromImage:(UIImage*)source;
{
  CGSize size = [source size];
  UIGraphicsBeginImageContext(size);
  CGRect rect = CGRectMake(0, 0, size.width, size.height);
  [source drawInRect:rect blendMode:kCGBlendModeNormal alpha:1.0];

  CGContextRef context = UIGraphicsGetCurrentContext();
  CGContextSetRGBStrokeColor(context, 1.0, 0.5, 1.0, 1.0); 
  CGContextStrokeRect(context, rect);
  UIImage *testImg =  UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();
  return testImg;
}  

Ce code produira une bordure rose autour de l'image. Toutefois, si vous souhaitez simplement afficher la bordure, utilisez la couche UIImageView et définissez-la.

67
Marcus S. Zarra
#import <QuartzCore/CALayer.h>


UIImageView *imageView = [UIImageView alloc]init];
imageView.layer.masksToBounds = YES;
imageView.layer.borderColor = [UIColor blackColor].CGColor;
imageView.layer.borderWidth = 1;    

Ce code peut être utilisé pour ajouter la bordure de vue UIImageView.

38
Faizan Refai
imageView_ProfileImage.layer.cornerRadius =10.0f;
imageView_ProfileImage.layer.borderColor = [[UIColor blackColor] CGColor];
imageView_ProfileImage.layer.borderWidth =.4f;
imageView_ProfileImage.layer.masksToBounds = YES;
11
Bijendra Singh

Si vous connaissez les dimensions de votre image, l'ajout d'une bordure au calque de UIImageView constitue la meilleure solution, autant que je sache. Enfait, vous pouvez simplement définir votre image Voir x, y, image.size.width, image.size.height

Si vous avez un ImageView de taille fixe avec des images chargées dynamiquement qui sont redimensionnées (ou redimensionnées à AspectFit), votre objectif est de redimensionner la vue d’image à la nouvelle image redimensionnée.

Le moyen le plus court de le faire:

// containerView is my UIImageView
containerView.layer.borderWidth = 7;
containerView.layer.borderColor = [UIColor colorWithRed:0.22 green:0.22 blue:0.22 alpha:1.0].CGColor;

// this is the key command
[containerView setFrame:AVMakeRectWithAspectRatioInsideRect(image.size, containerView.frame)];

Mais pour utiliser AVMakeRectWithAspectRatioInsideRect, vous devez ajouter ceci. 

#import <AVFoundation/AVFoundation.h>

importez la déclaration dans votre fichier et incluez également la structure AVFoundation dans votre projet (fournie avec le SDK).

10
ScorpionKing2k5

Vous ne pouvez pas ajouter de bordure, mais cela fonctionnerait pour le même effet. Vous pouvez également transformer l'UIView appelé blackBG dans cet exemple en UIImageView avec une image de bordure et un milieu vierge, puis vous obtenez une bordure d'image personnalisée au lieu de simplement noire.

UIView *blackBG = [[UIView alloc] initWithFrame:CGRectMake(0,0,100,100)];

blackBG.backgroundColor = [UIColor blackColor];

UIImageView *myPicture = [[UIImageView alloc] initWithImage:
                          [UIImage imageNamed: @"myPicture.jpg"]];

int borderWidth = 10;

myPicture.frame = CGRectMake(borderWidth,
                             borderWidth,
                             blackBG.frame.size.width-borderWidth*2,
                             blackBG.frame.size.height-borderWidth*2)];

[blackBG addSubview: myPicture];
8
Andrew Johnson

toutes ces réponses fonctionnent bien MAIS ajouter un rect à une image . Supposons que vous avez une forme (dans mon cas un papillon) et que vous souhaitez ajouter une bordure (une bordure rouge):

nous avons besoin de deux étapes: 1) prendre l’image, la convertir en CGImage, passer à une fonction pour dessiner hors écran dans un contexte utilisant CoreGraphics, et restituer une nouvelle image CGImage

2) convertir à uiimage en arrière et dessiner:

// remember to release object!
+ (CGImageRef)createResizedCGImage:(CGImageRef)image toWidth:(int)width
andHeight:(int)height
{
// create context, keeping original image properties
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, width,
                                             height,
                                             8
                                             4 * width,
                                             colorspace,
                                             kCGImageAlphaPremultipliedFirst
                                             );

 CGColorSpaceRelease(colorspace);

if(context == NULL)
    return nil;

// draw image to context (resizing it)
CGContextSetInterpolationQuality(context, kCGInterpolationDefault);

CGSize offset = CGSizeMake(2,2);
CGFloat blur = 4;   
CGColorRef color = [UIColor redColor].CGColor;
CGContextSetShadowWithColor ( context, offset, blur, color);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
// extract resulting image from context
CGImageRef imgRef = CGBitmapContextCreateImage(context);
CGContextRelease(context);
return imgRef;

}

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

CGRect frame = CGRectMake(0,0,160, 122);
UIImage * img = [UIImage imageNamed:@"butterfly"]; // take low res OR high res, but frame should be the low-res one.
imgV = [[UIImageView alloc]initWithFrame:frame];
[imgV setImage: img];
imgV.center = self.view.center;
[self.view addSubview: imgV];

frame.size.width = frame.size.width * 1.3;
frame.size.height = frame.size.height* 1.3;
CGImageRef cgImage =[ViewController createResizedCGImage:[img CGImage] toWidth:frame.size.width andHeight: frame.size.height ];

imgV2 = [[UIImageView alloc]initWithFrame:frame];
[imgV2 setImage: [UIImage imageWithCGImage:cgImage] ];

// release:
if (cgImage) CGImageRelease(cgImage);

[self.view addSubview: imgV2];

}

J'ai ajouté un papillon normal et un plus grand papillon bordé de rouge.

6
ingconti

Vous pouvez ajouter une bordure à UIImageView, puis changer la taille de UIimageView en fonction de la taille de l'image:

#import <QuartzCore/QuartzCore.h>


// adding border to the imageView
[imageView.layer setBorderColor: [[UIColor whiteColor] CGColor]];
[imageView.layer setBorderWidth: 2.0];

// resize the imageView to fit the image size
CGSize size = [image size];
float factor = size.width / self.frame.size.width;
if (factor < size.height / self.frame.size.height) {
    factor = size.height / self.frame.size.height;
}

CGRect rect = CGRectMake(0, 0, size.width/factor, size.height/factor);
imageView.frame = rect;

Assurez-vous de définir l'origine de l'imageView au centre

5
poleB

Vous pouvez manipuler l'image elle-même, mais une meilleure solution consiste simplement à ajouter un UIView contenant le UIImageView et à modifier l'arrière-plan en noir. Puis définissez la taille de cette vue conteneur sur un peu plus grande que UIImageView.

Une autre façon est de faire directement à partir du concepteur.

Sélectionnez votre image et allez sous "Afficher l'inspecteur d'identité".

Ici, vous pouvez ajouter manuellement " Attributs d'exécution définis par l'utilisateur" :

layer.borderColor
layer.borderWidth


enter image description here

2
Luca Davanzo

// vous devez importer

QuartzCore/QuartzCore.h

& puis pour ImageView en bordure

[imageView.layer setBorderColor: [[UIColor blackColor] CGColor]];

[imageView.layer setBorderWidth: 2.0];

[imageView.layer setCornerRadius: 5.0];
1
Panky

Cette fonction vous renverra une image avec une bordure noire essayez ceci

- (UIImage *)addBorderToImage:(UIImage *)image frameImage:(UIImage *)blackBorderImage
{
    CGSize size = CGSizeMake(image.size.width,image.size.height);
    UIGraphicsBeginImageContext(size);

    CGPoint thumbPoint = CGPointMake(0,0);

    [image drawAtPoint:thumbPoint];


    UIGraphicsBeginImageContext(size);
    CGImageRef imgRef = blackBorderImage.CGImage;
    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, size.width,size.height), imgRef);
    UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    CGPoint starredPoint = CGPointMake(0, 0);
    [imageCopy drawAtPoint:starredPoint];
    UIImage *imageC = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return imageC;
}
1
SachinVsSachin

Dans Swift 3, voici comment vous le faites pour UIImage lui-même:

let size = CGSize(width: image.size.width, height: image.size.height)
UIGraphicsBeginImageContext(size)
let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
image?.draw(in: rect, blendMode: .normal, alpha: 1.0)
let context = UIGraphicsGetCurrentContext()
context?.setStrokeColor(red: 0, green: 0, blue: 0, alpha: 1)
context?.stroke(rect)
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

self.imageView.image = newImage
0
CodyMace

Pour ceux qui recherchent une solution plug-and-play sur UIImage, j'ai écrit la réponse de CodyMace comme une extension.

Usage: let outlined = UIImage(named: "something")?.outline()

extension UIImage {

    func outline() -> UIImage? {

        let size = CGSize(width: self.size.width, height: self.size.height)
        UIGraphicsBeginImageContext(size)
        let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
        self.draw(in: rect, blendMode: .normal, alpha: 1.0)
        let context = UIGraphicsGetCurrentContext()
        context?.setStrokeColor(red: 0, green: 0, blue: 0, alpha: 1)
        context?.stroke(rect)
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return newImage

    }

}
0
Mavrick Laakso

J'ai créé une classe qui ajoute une bordure à imageView h. Utilisez cette classe au lieu de UIImageView.J'ai donné un remplissage de 4. Vous pouvez donner selon votre souhait.

class UIBorderImageView: UIView {

private lazy var imageView: UIImageView = {
    let imageView = UIImageView()
    imageView.contentMode = .scaleAspectFit
    imageView.translatesAutoresizingMaskIntoConstraints = false
    return imageView
}()

override init(frame: CGRect) {
    super.init(frame: frame)
    self.backgroundColor = UIColor.White()
    self.layer.borderColor = UIColor.GreyMedium().cgColor
    self.layer.borderWidth = 1.0
    self.layer.cornerRadius = 4.0
    self.layer.masksToBounds = true
    self.setUpViews()
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

private func setUpViews(){
    self.addSubview(imageView)
    self.addConstraintsWithFormat(format: "H:|-4-[v0]-4-|", views: imageView)
    self.addConstraintsWithFormat(format: "V:|-4-[v0]-4-|", views: imageView)
}

func configureImageViewWith(image:UIImage){
    self.imageview.image = image 
}}
0
Pranav Gupta