আমি কীভাবে একটি ইউআইআইমেজ নিতে পারি এবং এটি একটি কালো সীমানা দিতে পারি?


126

আমি কীভাবে একটি এর সীমানা সেট করতে পারি UIImage?


সুযোগক্রমে যদি কেউ গুগল অনুসন্ধানের মাধ্যমে শোনেন (যেমনটি আমি করেছিলেন) এবং ইউআইআইমেজভিউতে কোনও সীমানা যুক্ত করার সন্ধান করছেন, নীচে @ এমক্লিন দ্বারা উত্তরটি সন্ধান করুন। দুর্দান্ত কাজ!
মহেন্দ্র লিয়া

উত্তর:


241

OS> 3.0 এর সাহায্যে আপনি এটি করতে পারেন:

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

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

1
আমি যখন উপরের চিত্রের ভিউগুলিতে ছবিগুলি ফ্যাট করি তখন চিত্রটি নিখুঁতভাবে দেখা যায় তবে চিত্রের দিকগুলি ফাঁকা থাকে এবং চিত্রটি ল্যান্ডস্কেপ হলে চিত্রের উপরের এবং নীচের অংশে একই ঘটে। ফাঁকা জায়গাটিকে সীমান্ত সেট করার সাথে কুশ্রী লাগছে .. আপনি কি এই সমস্যার মুখোমুখি হয়েছিলেন? যদি হ্যাঁ, তবে এটি সমাধান করার জন্য দয়া করে কোনও পদ্ধতির পরামর্শ দিন
মিলিত

@ হামতুসি চিত্রভিউ.আইমিজ = আমার আইমেজ;
কাইল Clegg

6
হ্যা, তুমি পারো. উদাহরণগুলি UIImageকোরগ্রাফিক্স সহ গ্রাফিক্সের প্রসঙ্গে আঁকতে পারে।
অ্যাডামস

@ রকস্টার ইঙ্গিত করার সাথে সাথে আপনাকে ইমেজভিউ.লেয়ার.মাস্কটোবাউন্ডস = ইয়েস যুক্ত করতে হতে পারে;
বজর্ন রোচে

এই লিঙ্কটি সমাধান আমি খুঁজছিলাম ছিল।
গ্র্যান্ডস্টেফ

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এবং এর সীমানাটি সেট করুন।


আপনি যে সীমান্তটি চান তা প্রস্থকে কীভাবে নির্দিষ্ট করবেন?
প্যাট্রিক


@ মার্কাসস.জারা আমি বুঝতে পারি যে এই প্রশ্নের উত্তর দেওয়া হয়েছিল তখন তাদের উপস্থিতি ছিল না, তবে এই সমাধান রেটিনা প্রদর্শনটিকে বিবেচনায় নেয় না। আপনি যদি এটি সংশোধন করতে পারেন তবে আমি সত্যিই কৃতজ্ঞ হব :)
লুক

@ লিউচাচ নমুনাটি সংশোধন করার দরকার নেই। আপনি রেটিনা ডিভাইসে থাকলে কেবল লাইনের প্রস্থ বৃদ্ধি করুন।
মার্কাস এস জাররা

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দেখার সীমানা যুক্ত করার জন্য ব্যবহার করা যেতে পারে ।


পারফেক্ট! সিজিআইমেজের ঝামেলা পেরোনোর ​​দরকার নেই। (আমার সীমানা সহ চিত্রটি সংরক্ষণ করার দরকার নেই)। একটি গুচ্ছ ধন্যবাদ!
সেপ্টেম্বর

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

যদি আপনি নিজের চিত্রের মাত্রা জানেন তবে ইউআইআইমেজভিউর স্তরের একটি সীমানা যুক্ত করাই সেরা সমাধান আফাইক AI প্রকৃতপক্ষে, আপনি কেবল নিজের চিত্র ফ্রেমটি এক্স, ওয়াই, ইমেজ.সাইজ.উইথ, ইমেজ.সাইজ.হাইটে সেট করতে পারেন

যদি আপনার ডায়নামিকালি লোড হওয়া চিত্রগুলির সাথে একটি নির্দিষ্ট আকারের একটি চিত্রের ভিউ থাকে যা পুনরায় আকার দেওয়া হচ্ছে (বা 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>

আপনার ফাইলটিতে বিবৃতি আমদানি করুন এবং আপনার প্রকল্পের এভিফাউন্ডেশন ফ্রেমওয়ার্কটিও অন্তর্ভুক্ত করুন (এসডিকে দিয়ে বান্ডেল হয়ে আসে)।


ধন্যবাদ @ ইরফিনস্কিপগ! অনেক প্রশংসিত.
বৃশ্চিক কিঙ্ক 2 কে 5

8

আপনি কোনও সীমানা যুক্ত করতে পারবেন না, তবে এটি একই প্রভাবের জন্য কাজ করবে। আপনি এই উদাহরণে ব্ল্যাকবিজি নামে পরিচিত ইউআইভিউও বর্ডার ইমেজ এবং ফাঁকা মাঝারি দিয়ে একটি ইউআইআইমেজভিউতে পরিণত করতে পারেন এবং তারপরে কেবল কালো রঙের পরিবর্তে আপনার পছন্দসই চিত্রের একটি সীমানা রয়েছে।

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) চিত্রটি গ্রহণ করুন, সিজিআইমেজে রূপান্তর করুন, কোরগ্রাফিক্স ব্যবহার করে একটি প্রসঙ্গে অফস্ক্রিন আঁকতে কোনও ফাংশনে যেতে হবে এবং একটি নতুন সিজিআইমেজ ফিরিয়ে দিন

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

আপনি ইউআইআইমেজভিউতে সীমানা যুক্ত করতে পারেন এবং তারপরে চিত্রের আকার অনুসারে ইউআইআইমেজভিউয়ের আকার পরিবর্তন করতে পারেন:

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

নিশ্চিত করুন যে আপনি চিত্রটি দেখার উত্সটি কেন্দ্রে স্থাপন করেছেন


2

আপনি চিত্রটি নিজেরাই হেরফের করতে পারেন তবে আরও ভাল উপায় হ'ল কেবল এমন একটি ইউআইভিউ যুক্ত করুন যাতে ইউআইআইমেজভিউ থাকে এবং পটভূমিটিকে কালো করে দেওয়া হয়। তারপরে সেই ধারক দৃশ্যের আকারটি ইউআইআইমেজভিউয়ের থেকে কিছুটা বড় আকারে সেট করুন।


এটি কি বিভিন্ন আকারের চিত্রের সাথে কাজ করে যা উড়তে পরিবর্তন হয়? ইউআইআইমেজভিউ সব সময় বদলে যাবে, এবং ইউআইভিউ? পিএস ম্যানিপুলেট ইমেজ নিজেই দুর্দান্ত হবে।
শে

আপনাকে চিত্রের সাথে ধারণকৃত দৃশ্যের ফ্রেমটি সামঞ্জস্য করতে হবে - আপনি উভয় দর্শনের জন্য কেন্দ্রের বৈশিষ্ট্যগুলি সঞ্চয় করতে পারবেন, চিত্রের আকারকে সামঞ্জস্য করতে পারেন, ধারকটির আকারটি সামঞ্জস্য করতে পারেন এবং এরপরে উভয়ের জন্য কেন্দ্রের বৈশিষ্ট্যগুলি পুনরায় সেট করতে পারেন।
কেন্ডল হেলস্টেটার জেলনার

সিজি দিয়ে পথ চালানোর বিপরীতে আমি ঠিক এটিই করেছি did সহজ মনে হয়েছিল।
কোরি ফ্লয়েড

2

আরেকটি উপায় হ'ল সরাসরি ডিজাইনার থেকে করা।

আপনার চিত্র নির্বাচন করুন এবং "পরিচয় পরিদর্শক দেখান" এর নীচে যান।

এখানে আপনি ম্যানুয়ালি " ব্যবহারকারী সংজ্ঞায়িত রানটাইম বৈশিষ্ট্য" যুক্ত করতে পারেন :

layer.borderColor
layer.borderWidth


এখানে চিত্র বর্ণনা লিখুন


1
আপনার সিজি কালার প্রয়োজন হওয়ায় এটি কাজ করছে না এবং এক্সআইবিয়ের মাধ্যমে এটি কেবল ইউআইসিওলর সরবরাহ করে
কোডসনোকার

রঙ চলবে না, তবে আপনার যদি কেবল একটি কালো প্রয়োজন হয় - এটি সর্বাধিক "কোডের লাইন" দক্ষ উত্তর = ডি
সোপ্রোফ

1

// আপনার আমদানি করা দরকার

QuartzCore/QuartzCore.h

এবং তারপরে সীমানায় ইমেজভিউয়ের জন্য

[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-এ আপনি নিজেই এটি কীভাবে ইউআইআইজেইজে করবেন:

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

ইউআইআইমেজে প্লাগ-অ্যান্ড-প্লে সলিউশন যারা খুঁজছেন তাদের জন্য আমি এক্সটেনশন হিসাবে কোডি ম্যাসের উত্তর লিখেছিলাম।

ব্যবহার: 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

আমি একটি ক্লাস তৈরি করেছি যা ইমেজভিউ এইচ এ একটি বর্ডার যুক্ত করে। এই ক্লাসটি ইউআইআইমেজভিউয়ের পরিবর্তে ব্যবহার করুন I আমি ৪ এর প্যাডিং দিয়েছি your আপনি নিজের ইচ্ছানুযায়ী দিতে পারেন।

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;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.