2009-08-30 2 views

ответ

2

Вы можете манипулировать самим изображением, но гораздо лучший способ - просто добавить UIView, который содержит UIImageView, и изменить фон на черный. Затем установите размер этого вида контейнера немного больше, чем UIImageView.

+0

Будет ли работать с другим размером изображений, которые меняются «на лету»? UIImageView будет меняться все время и UIView? p.s. Манипулировать образ сам по себе будет здорово. – Shay

+0

Вам нужно будет отрегулировать рамку содержащего вида вместе с изображением - вы можете сэкономить свойства центра для обоих видов, отрегулировать размер изображения, отрегулировать размер контейнера, а затем снова установить свойства центра для обоих. –

+0

Это именно то, как я это делал, в отличие от поглаживания пути с помощью CG. просто казалось легче. –

8

Вы не можете добавить границу, но это будет работать с тем же эффектом. Вы также можете сделать UIView, названный blackBG в этом примере, в UIImageView с пограничным изображением и пустой серединой, а затем у вас будет пользовательская граница изображения, а не только черная.

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]; 
+0

Это то, что я закончил делать; вставляя мой 'UIImageView' в центр чуть большего' UIView' моего цвета рамки. –

65

Вы можете сделать это путем создания нового образа (также ответил на ваш другой публикации этого вопроса):

- (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; 
} 

Этот код будет производить розовую рамку вокруг изображения. Однако, если вы собираетесь просто отобразить границу, используйте слой UIImageView и установите его границу.

+0

Как вы определяете ширину границы, которую хотите? – Patrick

+16

'CGContextSetLineWidth' –

+0

@ MarcusS.Zarra Я понимаю, что они не существовали, когда на этот вопрос был дан ответ, но это решение не учитывает дисплей Retina. Если бы вы могли его пересмотреть, я был бы очень благодарен :) – Luke

235

С OS> 3,0 вы можете сделать это:

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

[imageView.layer setBorderColor: [[UIColor blackColor] CGColor]]; 
[imageView.layer setBorderWidth: 2.0]; 
+70

, но это для uiimageview, а не для uiimage ... –

+0

Большое спасибо .. :) – Sarah

+0

Хорошая работа @mclin ........ Сэкономленный мой день .... Спасибо – Meet

5

Вы можете добавить границу в UIImageView, а затем изменить размер UIImageView в зависимости от размера изображения:

#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; 

Make убедитесь, что вы установили источник изображенияView в центр

36
#import <QuartzCore/CALayer.h> 


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

Этот код может быть использован для добавления UIImageView Открыть границы.

+0

безупречный! Не нужно переживать хлопоты CGImage. (Мне не нужно было сохранять изображение с помощью рамки). Огромное спасибо! – Septronic

5

все эти ответы работают нормально, но добавьте прямое изображение. Предположим, у вас есть форма (в моем случае бабочка) и Вы хотите добавить границу (красная граница):

нам нужно два этапа: 1) принимают изображение, преобразовывают в CGImage, перейти к функции рисовать закадровый в контексте использования CoreGraphics и вернуть новый CGImage

2) преобразовать UIImage назад и рисовать:

// 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]; 

}

Я добавил нормальную бабочку и большую бабочку с красной границей.

+0

есть способ установить ширину красной границы здесь. – coder1010

10

Если вы знаете размеры своего изображения, то добавление границы слоя UIImageView является лучшим решением AFAIK. Infact, вы можете просто установить изображение вашего изображения в x, y, image.size.width, image.size.height

Если у вас есть ImageView фиксированного размера с динамически загружаемыми изображениями, которые изменяются (или масштабируются до AspectFit), тогда ваша цель - изменить размер изображения на новое измененное изображение.

Самый короткий способ сделать это:

// 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)]; 

Но использовать AVMakeRectWithAspectRatioInsideRect, вам нужно добавить этот

#import <AVFoundation/AVFoundation.h> 

оператор импорта в файл, а также включать в себя рамки AVFoundation в проекте (поставляется в комплекте с SDK).

+0

ЭТО - хороший, легкий и лучший ответ здесь! – rafinskipg

+0

Спасибо @rafinskipg! Очень признателен. – ScorpionKing2k5

1

Эта функция вернет вам изображение с черной рамкой попробовать это .. надеюсь, что это поможет вам

- (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; 
} 
+0

Если вы обнаружили какие-либо глифы, пожалуйста, дайте мне знать ... я улучшу его – SachinVsSachin

1

// Вы должны импортировать

QuartzCore/QuartzCore.h 

& затем для ImageView в границах

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

[imageView.layer setBorderWidth: 2.0]; 

[imageView.layer setCornerRadius: 5.0]; 
2

Другой способ - сделать непосредственно от дизайнера.

Выберите свое изображение и перейдите в раздел «Показать инспектора удостоверений».

Здесь вы можете вручную добавить "User Defined выполнения Атрибуты":

layer.borderColor 
layer.borderWidth 


enter image description here

+1

Это не сработает, поскольку вам нужен CGColor и через XIB он обеспечивает только UIColor – codesnooker

+0

Цвет не будет работать, но если вам просто нужен черный - это наиболее «строки кода». Эффективный ответ = D – soprof

9
imageView_ProfileImage.layer.cornerRadius =10.0f; 
imageView_ProfileImage.layer.borderColor = [[UIColor blackColor] CGColor]; 
imageView_ProfileImage.layer.borderWidth =.4f; 
imageView_ProfileImage.layer.masksToBounds = YES; 
+0

Блестящий взломать, особенно когда речь заходит об использовании памяти - другие ответы потребуют 2x-памяти, чтобы на мгновение добавить эту границу. Pro tip - Если вы хотите просто добавить границу с одной стороны, вы также можете изменить границы. Отличный ответ! – judepereira

0

В Swift 3 вот как вы это делаете на самом UIImage :

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

Для тех, кто ищет решение Plug-and-play на UIImage, я написал ответ CodyMace как расширение.

Использование: 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

Я использую этот метод, чтобы добавить рамку вне изображения. Вы можете настроить ширину границы в boderWidth константе.

Swift 3

func addBorderToImage(image : UIImage) -> UIImage { 
    let bgImage = image.cgImage 
    let initialWidth = (bgImage?.width)! 
    let initialHeight = (bgImage?.height)! 
    let borderWidth = Int(Double(initialWidth) * 0.10); 
    let width = initialWidth + borderWidth * 2 
    let height = initialHeight + borderWidth * 2 
    let data = malloc(width * height * 4) 

    let context = CGContext(data: data, 
         width: width, 
         height: height, 
         bitsPerComponent: 8, 
         bytesPerRow: width * 4, 
         space: (bgImage?.colorSpace)!, 
         bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue); 

    context?.draw(bgImage!, in: CGRect(x: CGFloat(borderWidth), y: CGFloat(borderWidth), width: CGFloat(initialWidth), height: CGFloat(initialHeight))) 
    context?.setStrokeColor(UIColor.white.cgColor) 
    context?.setLineWidth(CGFloat(borderWidth)) 
    context?.move(to: CGPoint(x: 0, y: 0)) 
    context?.addLine(to: CGPoint(x: 0, y: height)) 
    context?.addLine(to: CGPoint(x: width, y: height)) 
    context?.addLine(to: CGPoint(x: width, y: 0)) 
    context?.addLine(to: CGPoint(x: 0, y: 0)) 
    context?.strokePath() 

    let cgImage = context?.makeImage() 
    let uiImage = UIImage(cgImage: cgImage!) 

    free(data) 

    return uiImage; 
} 
Смежные вопросы