मैं एक UIImage कैसे ले सकता हूं और इसे काली सीमा दे सकता हूं?


126

मैं एक की सीमा कैसे निर्धारित कर सकता हूं UIImage?


संयोग से, अगर कोई भी व्यक्ति एक Google खोज (जैसा मैंने किया था) सुनता है और UIImageView में एक सीमा जोड़ने के लिए देख रहा है, तो नीचे दिए गए @mclin द्वारा उत्तर की तलाश करें। बहुत अच्छा काम करता है!
महेंद्र लिया

जवाबों:


241

OS> 3.0 के साथ आप यह कर सकते हैं:

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

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

1
जब मैं उपरोक्त imageView में छवियों को प्रदर्शित करता हूं, तो छवि को पूरी तरह से देखा जाता है, लेकिन छवि के किनारों को खाली छोड़ दिया जाता है, और छवि के परिदृश्य के ऊपरी और निचले हिस्से में भी ऐसा ही होता है। खाली स्थान बदसूरत दिखता है जिसके साथ सीमा निर्धारित है .. क्या आपने इस मुद्दे का सामना किया है? यदि हां, तो इस समस्या के समाधान के लिए एक विधि का सुझाव दें
मिलिए

@ Hamutsi imageView.image = myImage;
काइल क्लेग

6
हाँ तुम कर सकते हो। UIImageकोरग्राफिक्स के साथ ग्राफिक्स के संदर्भ में उदाहरण प्रस्तुत किए जा सकते हैं।
मार्क एडम्स

जैसा कि @rockstar बताते हैं, आपको imageView.layer.masksToBounds = YES जोड़ने की आवश्यकता हो सकती है;
ब्योर्न रोच

यह लिंक वह उपाय था जिसकी मुझे तलाश थी।
ग्रैंडस्टेपह

67

आप एक नई छवि बनाकर ऐसा कर सकते हैं (इस प्रश्न के आपके अन्य पोस्टिंग में भी उत्तर दिया गया है):

- (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और इसकी बॉर्डर सेट करें।


आप जिस सीमा को चाहते हैं उसकी चौड़ाई कैसे निर्दिष्ट करते हैं?
पैट्रिक

16

@ MarcusS.Zarra मुझे लगता है कि वे मौजूद नहीं थे जब इस सवाल का जवाब दिया गया था, लेकिन यह समाधान रेटिना प्रदर्शन को ध्यान में नहीं रखता है। यदि आप इसे संशोधित कर सकते हैं तो मैं वास्तव में आभारी रहूंगा :)
ल्यूक

@lukech नमूने को संशोधित करने की आवश्यकता नहीं है। यदि आप रेटिना डिवाइस पर हैं तो बस लाइन की चौड़ाई बढ़ाएँ।
मार्कस एस। ज़रा

2
size320x480 या नहीं, आप एक रेटिना डिवाइस पर हैं, की परवाह किए बिना है, इसलिए जब आप छवि बचाने के लिए, यह है कि 320x480px संकल्प, नहीं 640x960 में बचत होती है।
ल्यूक

38
#import <QuartzCore/CALayer.h>


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

इस कोड का उपयोग UIImageViewदृश्य सीमा जोड़ने के लिए किया जा सकता है ।


उत्तम! CGImage की परेशानी से गुजरने की जरूरत नहीं है। (मुझे सीमा के साथ छवि को बचाने की आवश्यकता नहीं थी)। बहुत बहुत धन्यवाद!
सेप्टोनिक

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

शानदार हैक, खासकर जब यह मेमोरी उपयोग की बात आती है - तो अन्य उत्तर 2x मेमोरी को ले लेंगे बस उस सीमा को क्षण भर में जोड़ने के लिए। प्रो टिप - यदि आप एक तरफ सिर्फ एक सीमा जोड़ना चाह रहे हैं, तो आप सीमा को भी बदल सकते हैं। बहुत बढ़िया जवाब!
जुडेपेरेरा

11

यदि आप अपनी छवि के आयामों को जानते हैं, तो UIImageView की परत में एक सीमा जोड़ना सबसे अच्छा समाधान AFAIK है। वास्तव में, आप बस अपनी छवि को x, y, image.size. उपलब्धता, 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 ढांचे को शामिल करें (एसडीके के साथ बंडल में आता है)।


धन्यवाद @ अर्फिंक्सिपग! बहुत सराहना की।
स्कॉर्पियनकिंग २ के ५

8

आप एक सीमा नहीं जोड़ सकते, लेकिन यह उसी प्रभाव के लिए काम करेगा। आप इस उदाहरण में एक UIImageView में एक सीमा छवि और एक रिक्त मध्य के साथ UIView को ब्लैकबीजी भी बना सकते हैं, और फिर आपके पास सिर्फ काले रंग के बजाय एक कस्टम छवि सीमा होगी।

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

यह वही है जो मैंने करना समाप्त कर दिया है; मेरे फ्रेम रंग के UIImageViewथोड़ा बड़े UIViewके केंद्र में मेरा घोंसला बनाना ।
बजे बेन क्रीगर

6

ये सभी उत्तर ठीक काम करते हैं लेकिन एक छवि में एक आयत जोड़ते हैं। मान लीजिए कि आपके पास एक आकार है (मेरे मामले में एक तितली) और आप एक सीमा (एक लाल सीमा) जोड़ना चाहते हैं:

हमें दो चरणों की आवश्यकता है: 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];

}

मैंने एक सामान्य तितली और एक लाल-बॉर्डर वाली बड़ी तितली को जोड़ा।


क्या यहां लाल सीमा की चौड़ाई निर्धारित करने का कोई तरीका है।
कोडर 1010

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;

सुनिश्चित करें कि आप imageView की उत्पत्ति को केंद्र में सेट करना चाहते हैं


2

आप स्वयं छवि को हेरफेर कर सकते हैं, लेकिन एक बेहतर तरीका यह है कि आप केवल एक UIView को जोड़ दें जिसमें UIImageView शामिल है, और पृष्ठभूमि को काले रंग में बदलें। फिर उस कंटेनर दृश्य का आकार UIImageView की तुलना में थोड़ा बड़ा सेट करें।


क्या यह उन चित्रों के एक अलग आकार के साथ काम करने वाला है जो मक्खी पर बदलते हैं? UIImageView हर समय बदलेगा, और UIView? ps छवि को स्वयं ही महान बनाना है।
शाए

आपको छवि के साथ युक्त दृश्य के फ़्रेम को समायोजित करना होगा - आप दोनों दृश्यों के लिए केंद्र गुणों को सहेज सकते हैं, छवि आकार को समायोजित कर सकते हैं, कंटेनर आकार को समायोजित कर सकते हैं, और फिर दोनों के लिए केंद्र गुणों को फिर से सेट कर सकते हैं।
केंडल हेल्मसटेटर गेलनर

यह ठीक उसी तरह है जैसे मैंने इसे सीजी के साथ पथ को पथभ्रष्ट करने के लिए किया था। बस आसान लग रहा था।
कोरी फ्लोयड

2

एक और तरीका डिजाइनर से सीधे करना है।

अपनी छवि का चयन करें और "आइडेंटिटी इंस्पेक्टर दिखाएं" के तहत जाएं।

यहाँ आप मैन्युअल रूप से " उपयोगकर्ता परिभाषित रनटाइम विशेषताएँ" जोड़ सकते हैं :

layer.borderColor
layer.borderWidth


यहाँ छवि विवरण दर्ज करें


1
यह काम नहीं करने वाला है क्योंकि आपको CGColor की आवश्यकता है और XIB के माध्यम से यह केवल UIColor प्रदान करता है
कोडन्यूकर

रंग काम नहीं करेगा, लेकिन अगर आपको सिर्फ एक काले रंग की आवश्यकता है - यह कोड की सबसे "कुशल" पंक्तियां है = डी
सोप्रोफ़ जूल

1

// आपको आयात करने की आवश्यकता है

QuartzCore/QuartzCore.h

और फिर बॉर्डर में ImageView के लिए

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

[imageView.layer setBorderWidth: 2.0];

[imageView.layer setCornerRadius: 5.0];

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

अगर आपको कोई ग्लिच मिल गया तो कृपया मुझे बताएं ... मैं इसे सुधार
दूंगा

1

स्विफ्ट 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

1

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

मैंने एक वर्ग बनाया है जो imageView h पर बॉर्डर जोड़ता है। UIImageView के बजाय इस वर्ग का उपयोग करें। मैंने 4 का पैडिंग दिया है। आप अपनी इच्छानुसार दे सकते हैं।

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

-1

मैं इस पद्धति का उपयोग छवि के बाहर सीमा जोड़ने के लिए करता हूं । आप बॉर्डर की चौड़ाई को कस्टमाइज़ कर सकते हैंboderWidth निरंतर ।

स्विफ्ट 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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.