কোনও ইউআইআইজেজকে পুনরায় আকার দেওয়ার সহজ উপায়?


397

আমার আইফোন অ্যাপে আমি ক্যামেরা সহ একটি ছবি তুলি, তারপরে আমি এটির 290 * 390 পিক্সেল আকারে পরিবর্তন করতে চাই। আমি চিত্রটি আকার পরিবর্তন করতে এই পদ্ধতিটি ব্যবহার করছিলাম:

UIImage *newImage = [image _imageScaledToSize:CGSizeMake(290, 390)
                         interpolationQuality:1];    

এটি নিখুঁতভাবে কাজ করে, তবে এটি একটি অনিবন্ধিত ফাংশন, তাই আমি আইফোন ওএস 4 এর সাথে এটি আর ব্যবহার করতে পারি না।

সুতরাং ... একটি ইউআইআইজেজকে পুনরায় আকার দেওয়ার সহজতম উপায় কী?


2019 এ করার উপায়, nshipster.com/image-resizing
dengST30

উত্তর:


772

সহজ উপায় হ'ল আপনার ফ্রেম UIImageViewসেট করে সেট করুনcontentMode এবং পুনরায় আকার দেওয়ার বিকল্পগুলির মধ্যে একটিতে ।

অথবা আপনি যদি এই চিত্রটির আকার পরিবর্তন করতে চান তবে আপনি এই ইউটিলিটি পদ্ধতিটি ব্যবহার করতে পারেন:

+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
    //UIGraphicsBeginImageContext(newSize);
    // In next line, pass 0.0 to use the current device's pixel scaling factor (and thus account for Retina resolution).
    // Pass 1.0 to force exact pixel size.
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();    
    UIGraphicsEndImageContext();
    return newImage;
}

ব্যবহারের উদাহরণ:

#import "MYUtil.h"

UIImage *myIcon = [MYUtil imageWithImage:myUIImageInstance scaledToSize:CGSizeMake(20, 20)];

11
আমি এখানে ফলাফলটি ধরে রাখব না। newImageইতিমধ্যে স্বতঃস্ফুর্ত হবে এবং এটি ধরে রাখা বা না রাখার জন্য এটি যে পদ্ধতিটিকে ডেকে আনা হয়েছে এটি পর্যন্ত এটির উচিত। initপদ্ধতিটির নামের অংশ না হওয়ায় এই পদ্ধতিটি কেবল একটি মেমরি বাগের জন্য ভিক্ষা করছে । আমি এই জাতীয় নামের একটি পদ্ধতিটি একটি স্বাবলম্বিত বস্তুকে প্রত্যাবর্তনের আশা করব।
অ্যালেক্স ওয়েন

বৈধ পয়েন্ট, এবং সম্পাদিত। আমি কেবল এই সতর্কতাটি রেখে যাব যে আমার কোড যা এটি ব্যবহার করে কোনও অতিরিক্ত রক্ষণ ছাড়াই অন্য কোথাও ম্যালোক ত্রুটি উত্পন্ন করে যা স্পষ্টত আমার দোষটি :-)।
পল লিঞ্চ

26
আইওএস ৪.০ হিসাবে, ইউআইজিগ্রাফিকস * ফাংশনগুলি সমস্ত থ্রেড-নিরাপদ।
বিজে হোমার

3
@ পল লিঞ্চ: মনে রাখবেন যে এই পরিবর্তনটি মূল পোস্টের মিশনটি ভেঙে দিয়েছে: কীভাবে কোনও চিত্রকে কিছু সঠিক পিক্সেল আকার ( পয়েন্ট আকারের বিপরীতে ) আকার দিতে হবে।
নিকোলাই রুহে

8
@ নিকোলাইরুহে চিহ্নিত সীমাবদ্ধতার কারণে যারা লড়াই করছেন তাদের জন্য, আপনি কলটিতে ০.০-এর পরিবর্তে ০.০ এর পরিবর্তে ০.০ পেরিয়ে ঠিক পিক্সেল আকারে জোর করতে পারেনUIGraphicsBeginImageContextWithOptions
ড্যানি

84

পল লিঞ্চের উত্তরের একটি সুইফ্ট সংস্করণ এখানে

func imageWithImage(image:UIImage, scaledToSize newSize:CGSize) -> UIImage{
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0);
    image.drawInRect(CGRectMake(0, 0, newSize.width, newSize.height))
    let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage
}

এবং একটি এক্সটেনশন হিসাবে:

public extension UIImage {
    func copy(newSize: CGSize, retina: Bool = true) -> UIImage? {
        // In next line, pass 0 to use the current device's pixel scaling factor (and thus account for Retina resolution).
        // Pass 1 to force exact pixel size.
        UIGraphicsBeginImageContextWithOptions(
            /* size: */ newSize,
            /* opaque: */ false,
            /* scale: */ retina ? 0 : 1
        )
        defer { UIGraphicsEndImageContext() }

        self.draw(in: CGRect(origin: .zero, size: newSize))
        return UIGraphicsGetImageFromCurrentImageContext()
    }
}

2
সবেমাত্র উল্লেখ করেছেন যে, আইওএসে, আপনার নিউসাইজটি 2x দ্বারা গুণ করবে, ডিভাইসের উপর ভিত্তি করে 3x
স্রুট এ.সুক

6
UIGraphicsBeginImageContextWithOptions (newSize, false, image.scale); সমস্ত ডিভাইসের জন্য
phnmnn

মনে রাখবেন যে এটি অন্তর্নিহিত সিজিআইমেজকে পুনরায় আকার দেয় না (কমপক্ষে আইওএস 12.1 এ)। প্রশ্নের ভিত্তিতে কোনটি ঠিক আছে তবে আপনি যদি চিত্রটি লেখেন তবে আপনাকে সিজিআইমেজ ব্যবহার করতে হবে এবং আপনি আসল চিত্রটি পাবেন।
প্রিভিট

72

আইওএস 10+ সমাধানের জন্য যথাযথ সুইফট 3.0 : বাক্য গঠন এবং ব্যবহার বন্ধ করে:ImageRenderer

func imageWith(newSize: CGSize) -> UIImage {
    let renderer = UIGraphicsImageRenderer(size: newSize)
    let image = renderer.image { _ in
        self.draw(in: CGRect.init(origin: CGPoint.zero, size: newSize))
    }

    return image.withRenderingMode(self.renderingMode)
}

এবং এখানে উদ্দেশ্য-সি সংস্করণটি রয়েছে:

@implementation UIImage (ResizeCategory)
- (UIImage *)imageWithSize:(CGSize)newSize
{
    UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:newSize];
    UIImage *image = [renderer imageWithActions:^(UIGraphicsImageRendererContext*_Nonnull myContext) {
        [self drawInRect:(CGRect) {.origin = CGPointZero, .size = newSize}];
    }];
    return [image imageWithRenderingMode:self.renderingMode];
}
@end

1
খুব মার্জিত সমাধান, এটি গ্রহণযোগ্য উত্তর হওয়া উচিত!
18:30

2
এটি মার্জিতের চেয়ে ভাল, এটি সঠিক। অ্যাপলের এপিআই ডক্স এই কোডটি যেমন করে ইউআইজিগ্রাফিক্স রেন্ডারার ব্যবহার করার জন্য নতুন কোডকে পরামর্শ দেয়। আপনাকে ধন্যবাদ
পল ব্রুনাও

1
প্রশ্নটি প্রায় 8 বছর পুরানো @ এবং এই পদ্ধতিটি কেবল iOS10 + এর জন্য কাজ করে বলেছে।

ক্লিপবোর্ডে নতুন চিত্রের সামগ্রীটি অনুলিপি করার সময় এটি আমার জন্য একটি সাদা ব্লক তৈরি করে। এটি আসলে চিত্রের দৃশ্যের আকার পরিবর্তন করছে না?
অলিভার ডিকসন

1
এই ফাংশনটি 0 উচ্চতা এবং 0 প্রস্থের চিত্র প্রত্যাবর্তন করে উচ্চতা 9000 উচ্চতা এবং 9000 প্রস্থের প্রত্যাশা করে।
কৃষ্ণ কুমার

31

ট্রেভর হাওয়ার্ডের কয়েকটি ইউআইআইমেজ বিভাগ রয়েছে যা আকারের আকারটি খুব সুন্দরভাবে পরিচালনা করে। অন্য কিছু না হলে আপনি উদাহরণ হিসাবে কোডটি ব্যবহার করতে পারেন।

দ্রষ্টব্য: আইওএস 5.1 হিসাবে, এই উত্তরটি অবৈধ হতে পারে। নীচে মন্তব্য দেখুন।


2
আমারও কিছু চিত্রের আকার পরিবর্তন করতে হবে এবং আমি প্রথমে ইউআইআইজেমে ট্রেভর এর সংযোজনগুলি চেষ্টা করেছিলাম তবে পিএনজির (আলফা চ্যানেল সম্পর্কে কিছু) অদ্ভুত বাগ পেয়েছি। এই প্রশ্নের গৃহীত উত্তরটি দুর্দান্তভাবে কাজ করেছে।
সরিগ

1
এই আর (সেটি এখন বৈধ অন্তত iOS5.1 সাথে আছেন
জেন

@ জান, পোস্টের নীচে কমিটগুলি দেখুন।
ভাইকিংগুন্ডো

@ জ্যান আপনি যদি মন্তব্যে প্রস্তাবিত সমাধানগুলি অনুসরণ করেন তবে "ম্যাট বলেছেন: 22 নভেম্বর, ২০১১ সন্ধ্যা :3:৩৯" "কারণ তিনি কালারস্পেসিফ প্রকাশ করেছেন (হর্সো 7 এর অনুরূপ সমাধানের বিপরীতে)।
বেন ফ্লিন

1
@ সান্মই এই আকার পরিবর্তনকারী কোনও পদ্ধতি ব্যবহার করে চিত্রগুলির তীক্ষ্ণ নেসটি হারাচ্ছে। তীক্ষ্ণতা অর্জনের কোনও উপায় আছে
vamsi575kg

31

সুইফট 4 এবং আইওএস 10+ এর জন্য আরও কমপ্যাক্ট সংস্করণ:

extension UIImage {
    func resized(to size: CGSize) -> UIImage {
        return UIGraphicsImageRenderer(size: size).image { _ in
            draw(in: CGRect(origin: .zero, size: size))
        }
    }
}

ব্যবহার:

let resizedImage = image.resized(to: CGSize(width: 50, height: 50))

26

আমি এটিও সম্পন্ন করে দেখেছি (যা আমি UIButtonsসাধারণ এবং নির্বাচিত রাষ্ট্রের জন্য ব্যবহার করি যেহেতু বোতামগুলি resizeমাপসই হয় না )। ক্রেডিট মূল লেখক যাকেই দেয়।

প্রথমে একটি খালি .h এবং .m ফাইল কল করুন UIImageResizing.hএবংUIImageResizing.m

// Put this in UIImageResizing.h
@interface UIImage (Resize)
- (UIImage*)scaleToSize:(CGSize)size;
@end

// Put this in UIImageResizing.m
@implementation UIImage (Resize)

- (UIImage*)scaleToSize:(CGSize)size {
UIGraphicsBeginImageContext(size);

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0.0, size.height);
CGContextScaleCTM(context, 1.0, -1.0);

CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, size.width, size.height), self.CGImage);

UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return scaledImage;
}

@end

আপনি যে ফাংশনটি ব্যবহার করতে যাচ্ছেন সেই এম। এম ফাইলে। .H ফাইলটি অন্তর্ভুক্ত করুন এবং তারপরে এটিকে কল করুন:

UIImage* image = [UIImage imageNamed:@"largeImage.png"];
UIImage* smallImage = [image scaleToSize:CGSizeMake(100.0f,100.0f)];

এটি চিত্রের অরিয়েন্টেশনকে অনুলিপি করে না।
কেভিন

20

পলের কোডে এই উন্নতি আপনাকে রেটিনা ডিসপ্লে সহ একটি আইফোনে একটি উচ্চতর রেস চিত্র দেবে। অন্যথায় স্কেলিংয়ের সময় এটি অস্পষ্ট।

+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[UIScreen mainScreen] scale] == 2.0) {
        UIGraphicsBeginImageContextWithOptions(newSize, YES, 2.0);
    } else {
        UIGraphicsBeginImageContext(newSize);
    }
} else {
    UIGraphicsBeginImageContext(newSize);
}
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();    
UIGraphicsEndImageContext();
return newImage;
}

13
শুধু এফওয়াইআই, আপনি যে পরিবর্তনগুলি করেছেন তা অপ্রয়োজনীয়, যেহেতু স্কেলের জন্য ০.০ এর মান সরবরাহ করা UIGraphicsBeginImageContextWithOptionsস্বয়ংক্রিয়ভাবে মূল পর্দার স্কেল ব্যবহার করবে (আইওএস ৩.২ হিসাবে)।
অ্যান্ড্রু আর।

16

এখানে একটি সহজ উপায়:

    UIImage * image = [UIImage imageNamed:@"image"];
    CGSize sacleSize = CGSizeMake(10, 10);
    UIGraphicsBeginImageContextWithOptions(sacleSize, NO, 0.0);
    [image drawInRect:CGRectMake(0, 0, sacleSize.width, sacleSize.height)];
    UIImage * resizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

রাইজাইজড ইমেজ একটি নতুন চিত্র।


16

স্ট্রেচ ফিল, অ্যাসপেক্ট ফিল এবং অ্যাসপেক্ট ফিটের জন্য দ্রুত সমাধান ift

extension UIImage {
    enum ContentMode {
        case contentFill
        case contentAspectFill
        case contentAspectFit
    }

    func resize(withSize size: CGSize, contentMode: ContentMode = .contentAspectFill) -> UIImage? {
        let aspectWidth = size.width / self.size.width
        let aspectHeight = size.height / self.size.height

        switch contentMode {
        case .contentFill:
            return resize(withSize: size)
        case .contentAspectFit:
            let aspectRatio = min(aspectWidth, aspectHeight)
            return resize(withSize: CGSize(width: self.size.width * aspectRatio, height: self.size.height * aspectRatio))
        case .contentAspectFill:
            let aspectRatio = max(aspectWidth, aspectHeight)
            return resize(withSize: CGSize(width: self.size.width * aspectRatio, height: self.size.height * aspectRatio))
        }
    }

    private func resize(withSize size: CGSize) -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(size, false, self.scale)
        defer { UIGraphicsEndImageContext() }
        draw(in: CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height))
        return UIGraphicsGetImageFromCurrentImageContext()
    }
}

এবং ব্যবহার করতে আপনি নিম্নলিখিতটি করতে পারেন:

let image = UIImage(named: "image.png")!
let newImage = image.resize(withSize: CGSize(width: 200, height: 150), contentMode: .contentAspectFill)

আবদুল্লাহসেলেককে তার আসল সমাধানের জন্য ধন্যবাদ।


15

উপরে iWasRobbed দ্বারা লিখিত বিভাগের একটি পরিবর্তন এখানে দেওয়া হয়েছে। এটি মূল চিত্রটিকে বিকৃত করার পরিবর্তে অনুপাতের অনুপাত রাখে।

- (UIImage*)scaleToSizeKeepAspect:(CGSize)size {
    UIGraphicsBeginImageContext(size);

    CGFloat ws = size.width/self.size.width;
    CGFloat hs = size.height/self.size.height;

    if (ws > hs) {
        ws = hs/ws;
        hs = 1.0;
    } else {
        hs = ws/hs;
        ws = 1.0;
    }

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, 0.0, size.height);
    CGContextScaleCTM(context, 1.0, -1.0);

    CGContextDrawImage(context, CGRectMake(size.width/2-(size.width*ws)/2,
        size.height/2-(size.height*hs)/2, size.width*ws,
        size.height*hs), self.CGImage);

    UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return scaledImage;
}

11

আপনি যদি কেবল একটি চিত্র ছোট চান এবং সঠিক আকারের যত্ন না রাখেন:

+ (UIImage *)imageWithImage:(UIImage *)image scaledToScale:(CGFloat)scale
{
    UIGraphicsBeginImageContextWithOptions(self.size, YES, scale);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
    [self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

স্কেল সেট করা 0.25fআপনাকে একটি 8 এমপি ক্যামেরা থেকে 616 বাই 612 চিত্র দেবে।

যাদের প্রয়োজন তাদের জন্য এখানে একটি বিভাগ ইউআইআইমেজ + স্কেল


10

এত জটিল কেন? আমি মনে করি সিস্টেম এপিআই ব্যবহার করা একই ফলাফল অর্জন করতে পারে:

UIImage *largeImage;
CGFloat ratio = 0.4; // you want to get a new image that is 40% the size of large image.
UIImage *newImage = [UIImage imageWithCGImage:largeImage.CGImage
                                        scale:1/ratio
                                  orientation:largeImage.imageOrientation];
// notice the second argument, it is 1/ratio, not ratio.

দ্বিতীয় আর্গুমেন্ট হিসাবে আপনার লক্ষ্যমাত্রার অনুপাতের বিপরীতটি একমাত্র গোটচা হওয়া উচিত, নথি অনুসারে দ্বিতীয় প্যারামিটারটি নতুন স্কেল হওয়াটির তুলনায় মূল চিত্রের অনুপাত নির্দিষ্ট করে।


কারণ স্কেল (%) পিক্সেল (ডাব্লু / এইচ) এর মতো জিনিস নয়।

স্কেলটি বৃহত্তর আইমেজ.স্কেল / অনুপাত 1 / অনুপাতের হওয়া উচিত।
মারিওন আর্নে

9

এটি সুইচ 3 এবং সুইফট 4 এর সাথে সামঞ্জস্যপূর্ণ একটি ইউআইআইমেজ এক্সটেনশন যা কোনও অনুপাতের সাথে চিত্রকে দেওয়া আকারকে স্কেল করে

extension UIImage {

    func scaledImage(withSize size: CGSize) -> UIImage {
        UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
        defer { UIGraphicsEndImageContext() }
        draw(in: CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height))
        return UIGraphicsGetImageFromCurrentImageContext()!
    }

    func scaleImageToFitSize(size: CGSize) -> UIImage {
        let aspect = self.size.width / self.size.height
        if size.width / aspect <= size.height {
            return scaledImage(withSize: CGSize(width: size.width, height: size.width / aspect))
        } else {
            return scaledImage(withSize: CGSize(width: size.height * aspect, height: size.height))
        }
    }

}

ব্যবহারের উদাহরণ

let image = UIImage(named: "apple")
let scaledImage = image.scaleImageToFitSize(size: CGSize(width: 45.0, height: 45.0))

আমি ফাংশনটির নাম scaledImage(with size:)বা সুপারিশ করব scaledWithSize(_:)। এছাড়াও UIGraphicsGetImageFromCurrentImageContextসত্যিই ফিরে আসতে পারে না nil, সুতরাং !পাশাপাশি কাজ করবে। আপনি এতে রেক্টর তৈরিতে সরলীকৃত করতে পারেন CGRect(origin: .zero, size: size)
সুলতান

8

আমি অ্যাপলের নিজস্ব উদাহরণগুলিতে ইউআইআইমেজ এর জন্য একটি বিভাগ পেয়েছি যা একই কৌশলটি করে। এখানে লিঙ্কটি রয়েছে: https://developer.apple.com/library/ios/samplecode/sc2273/Listings/AirDropSample_UIImage_Resize_m.html

আপনাকে কেবল কলটি পরিবর্তন করতে হবে:

UIGraphicsBeginImageContextWithOptions(newSize, YES, 2.0);

মধ্যে imageWithImage:scaledToSize:inRect:সঙ্গে

UIGraphicsBeginImageContextWithOptions(newSize, NO, 2.0);

চিত্রটিতে আলফা চ্যানেলটি বিবেচনা করার জন্য।


6
 func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage 
{
        let scale = newWidth / image.size.width
        let newHeight = image.size.height * scale
        UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight))
        image.drawInRect(CGRectMake(0, 0, newWidth, newHeight))
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage
}

আপনার কোড সহ কিছু বর্ণনামূলক পাঠ্য যুক্ত করা ভাল ধারণা।
GMchris

6

আমার সহকর্মী জামারীয়দের জন্য, এখানে @ পল লিঞ্চ উত্তরের একটি Xamarin.iOS সি # সংস্করণ রয়েছে।

private UIImage ResizeImage(UIImage image, CGSize newSize) 
{
    UIGraphics.BeginImageContextWithOptions(newSize, false, 0.0f);
    image.Draw(new CGRect(0, 0, newSize.Width, newSize.Height));
    UIImage newImage = UIGraphics.GetImageFromCurrentImageContext();
    UIGraphics.EndImageContext();
    return newImage;
}

5

আপনি যদি কোনও ইউআইআইজেজের একটি থাম্বনেইল তৈরি করতে চান (আনুপাতিক আকার পরিবর্তন বা কিছু ফসলের সাথে জড়িত থাকতে পারে), তবে ইউআইআইমেজ + রেজাইজ বিভাগটি যা আপনাকে সংক্ষিপ্ত, চিত্রম্যাগিক-এর মতো সিনট্যাক্স ব্যবহার করতে দেয়:

UIImage* squareImage       = [image resizedImageByMagick: @"320x320#"];

5

[সিএফ ক্রিস] পছন্দসই আকারে আকার পরিবর্তন করতে :

UIImage *after = [UIImage imageWithCGImage:before.CGImage
                                     scale:CGImageGetHeight(before.CGImage)/DESIREDHEIGHT
                               orientation:UIImageOrientationUp];

বা, সমতুল্য, বিকল্প CGImageGetWidth(...)/DESIREDWIDTH


মনে রাখবেন যে চিত্রের ডেটা নিজেই আকার পরিবর্তন করা হয়নি তবে একটি স্কেল ফ্যাক্টর প্রয়োগ করা হয়েছে যার অর্থ মেমরিটিতে চিত্র একই আকারের।
inkredibl

5

সুইজার এক্সটেনশান হিসাবে রোজারিও শেভস উত্তর দেয়

func scaledTo(size: CGSize) -> UIImage{
    UIGraphicsBeginImageContextWithOptions(size, false, 0.0);
    self.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
    let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    return newImage
}

এবং বোনাসও

func scaledTo(height: CGFloat) -> UIImage{
    let width = height*self.size.width/self.size.height
    return scaledTo(size: CGSize(width: width, height: height))
}

5

ব্যর্থ সাফ বিকল্প সহ সুইফট ৩.০ (ত্রুটির ক্ষেত্রে মূল চিত্রটি ফেরত দেয়):

func resize(image: UIImage, toSize size: CGSize) -> UIImage{
    UIGraphicsBeginImageContextWithOptions(size,false,1.0)
    image.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
    if let resizedImage = UIGraphicsGetImageFromCurrentImageContext() {
        UIGraphicsEndImageContext()
        return resizedImage
    }
    UIGraphicsEndImageContext()
    return image
}

5

(সুইফট 4 সামঞ্জস্যপূর্ণ) আইওএস 10+ এবং আইওএস <10 সমাধান ( UIGraphicsImageRendererসম্ভব হলে ব্যবহার করে , UIGraphicsGetImageFromCurrentImageContextঅন্যথায়)

/// Resizes an image
///
/// - Parameter newSize: New size
/// - Returns: Resized image
func scaled(to newSize: CGSize) -> UIImage {
    let rect = CGRect(origin: .zero, size: newSize)

    if #available(iOS 10, *) {
        let renderer = UIGraphicsImageRenderer(size: newSize)
        return renderer.image { _ in
            self.draw(in: rect)
        }
    } else {
        UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
        self.draw(in: rect)
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage!
    }
}

5

চিত্রের প্রসারিত ছাড়াই কার্যকর পদ্ধতি সুইফট 4 4

// Method to resize image
func resize(image: UIImage, toScaleSize:CGSize) -> UIImage {
                UIGraphicsBeginImageContextWithOptions(toScaleSize, true, image.scale)
                        image.draw(in: CGRect(x: 0, y: 0, width: toScaleSize.width, height: toScaleSize.height))
                        let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
                        UIGraphicsEndImageContext()
                        return scaledImage!
                }

// কল পদ্ধতি

    let resizedImage = self.resize(image: UIImage(named: "YourImageName")!, toScaleSize: CGSize(width: 290, height: 390))

3

@ পল লিঞ্চের উত্তর দুর্দান্ত, তবে এটি চিত্রের অনুপাত পরিবর্তন করবে। আপনি যদি চিত্রের অনুপাত পরিবর্তন করতে না চান এবং এখনও নতুন আকারের জন্য নতুন চিত্রটি ফিট করতে চান তবে এটি ব্যবহার করে দেখুন।

+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {

// calculate a new size which ratio is same to original image
CGFloat ratioW = image.size.width / newSize.width;
CGFloat ratioH = image.size.height / newSize.height;

CGFloat ratio = image.size.width / image.size.height;

CGSize showSize = CGSizeZero;
if (ratioW > 1 && ratioH > 1) { 

    if (ratioW > ratioH) { 
        showSize.width = newSize.width;
        showSize.height = showSize.width / ratio;
    } else {
        showSize.height = newSize.height;
        showSize.width = showSize.height * ratio;
    }

} else if (ratioW > 1) {

    showSize.width = showSize.width;
    showSize.height = showSize.width / ratio;

} else if (ratioH > 1) {

    showSize.height = showSize.height;
    showSize.width = showSize.height * ratio;

}

//UIGraphicsBeginImageContext(newSize);
// In next line, pass 0.0 to use the current device's pixel scaling factor (and thus account for Retina resolution).
// Pass 1.0 to force exact pixel size.
UIGraphicsBeginImageContextWithOptions(showSize, NO, 0.0);
[image drawInRect:CGRectMake(0, 0, showSize.width, showSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;}

3

এই এক্সটেনশনটি ব্যবহার করুন

extension UIImage {
    public func resize(size:CGSize, completionHandler:(resizedImage:UIImage, data:NSData?)->()) {
        dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), { () -> Void in
            let newSize:CGSize = size
            let rect = CGRectMake(0, 0, newSize.width, newSize.height)
            UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0)
            self.drawInRect(rect)
            let newImage = UIGraphicsGetImageFromCurrentImageContext()
            UIGraphicsEndImageContext()
            let imageData = UIImageJPEGRepresentation(newImage, 0.5)
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                completionHandler(resizedImage: newImage, data:imageData)
            })
        })
    }
}

2

সুইফট ২.০:

let image = UIImage(named: "imageName")
let newSize = CGSize(width: 10, height: 10)

UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
image?.drawInRect(CGRectMake(0, 0, newSize.width, newSize.height))
let imageResized = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

2

এখানে আমার কিছুটা-ভার্বোজ সুইফট কোড

func scaleImage(image:UIImage,  toSize:CGSize) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(toSize, false, 0.0);

    let aspectRatioAwareSize = self.aspectRatioAwareSize(image.size, boxSize: toSize, useLetterBox: false)


    let leftMargin = (toSize.width - aspectRatioAwareSize.width) * 0.5
    let topMargin = (toSize.height - aspectRatioAwareSize.height) * 0.5


    image.drawInRect(CGRectMake(leftMargin, topMargin, aspectRatioAwareSize.width , aspectRatioAwareSize.height))
    let retVal = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return retVal
}

func aspectRatioAwareSize(imageSize: CGSize, boxSize: CGSize, useLetterBox: Bool) -> CGSize {
    // aspect ratio aware size
    // http://stackoverflow.com/a/6565988/8047
    let imageWidth = imageSize.width
    let imageHeight = imageSize.height
    let containerWidth = boxSize.width
    let containerHeight = boxSize.height

    let imageAspectRatio = imageWidth/imageHeight
    let containerAspectRatio = containerWidth/containerHeight

    let retVal : CGSize
    // use the else at your own risk: it seems to work, but I don't know 
    // the math
    if (useLetterBox) {
        retVal = containerAspectRatio > imageAspectRatio ? CGSizeMake(imageWidth * containerHeight / imageHeight, containerHeight) : CGSizeMake(containerWidth, imageHeight * containerWidth / imageWidth)
    } else {
        retVal = containerAspectRatio < imageAspectRatio ? CGSizeMake(imageWidth * containerHeight / imageHeight, containerHeight) : CGSizeMake(containerWidth, imageHeight * containerWidth / imageWidth)
    }

    return retVal
}

1
এটি আমার সময় সাশ্রয় করেছে। ধন্যবাদ!
Quy Nguyen

দরকারী, তবে সেগুটির পরে অদ্ভুত আচরণ এবং ক্রিয়াকলাপগুলি ফিরে আসার জন্য, এখানে দেখুন plz: stackoverflow.com/questions/30978685/…
তিনি Yifi 一

দয়া করে নোট করুন: আপনি guardএই aspectRatioAwareSizeফাংশনে একটি পূর্বশর্ত ( ) যুক্ত করতে চাইবেন যে কোনওরকম ইমেজসাইজ বা বক্সসাইজের ইনপুট প্যারামিটারগুলি যদি শূন্য ব্যতিক্রম দ্বারা ভাগ না করেCGSize.zero
pkluz

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

2

দ্রুত উত্তর 4:

func scaleDown(image: UIImage, withSize: CGSize) -> UIImage {
    let scale = UIScreen.main.scale
    UIGraphicsBeginImageContextWithOptions(withSize, false, scale)
    image.draw(in: CGRect(x: 0, y: 0, width: withSize.width, height: withSize.height))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage!
}

আসল স্কেল সেট করার দরকার নেই:The scale factor to apply to the bitmap. If you specify a value of 0.0, the scale factor is set to the scale factor of the device’s main screen.
নাথান

1

আমি আবিষ্কার করেছি যে এমন একটি উত্তর পাওয়া মুশকিল যে আপনি নিজের বাক্সের বাইরে বাক্স ব্যবহার করতে পারেন সুইফট 3 প্রকল্পের । অন্যান্য উত্তরের প্রধান সমস্যা যা তারা চিত্রের আলফা-চ্যানেলকে সম্মান করে না। আমি আমার প্রকল্পগুলিতে যে কৌশলটি ব্যবহার করছি তা এখানে।

extension UIImage {

    func scaledToFit(toSize newSize: CGSize) -> UIImage {
        if (size.width < newSize.width && size.height < newSize.height) {
            return copy() as! UIImage
        }

        let widthScale = newSize.width / size.width
        let heightScale = newSize.height / size.height

        let scaleFactor = widthScale < heightScale ? widthScale : heightScale
        let scaledSize = CGSize(width: size.width * scaleFactor, height: size.height * scaleFactor)

        return self.scaled(toSize: scaledSize, in: CGRect(x: 0.0, y: 0.0, width: scaledSize.width, height: scaledSize.height))
    }

    func scaled(toSize newSize: CGSize, in rect: CGRect) -> UIImage {
        if UIScreen.main.scale == 2.0 {
            UIGraphicsBeginImageContextWithOptions(newSize, !hasAlphaChannel, 2.0)
        }
        else {
            UIGraphicsBeginImageContext(newSize)
        }

        draw(in: rect)
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return newImage ?? UIImage()
    }

    var hasAlphaChannel: Bool {
        guard let alpha = cgImage?.alphaInfo else {
            return false
        }
        return alpha == CGImageAlphaInfo.first ||
            alpha == CGImageAlphaInfo.last ||
            alpha == CGImageAlphaInfo.premultipliedFirst ||
            alpha == CGImageAlphaInfo.premultipliedLast
    }
}

ব্যবহারের উদাহরণ:

override func viewDidLoad() {
    super.viewDidLoad()

    let size = CGSize(width: 14.0, height: 14.0)
    if let image = UIImage(named: "barbell")?.scaledToFit(toSize: size) {
        let imageView = UIImageView(image: image)
        imageView.center = CGPoint(x: 100, y: 100)
        view.addSubview(imageView)
    }
}

এই কোডটি একটি পুনর্লিখন আলফা চ্যানেল সহ এবং ছাড়াই চিত্রগুলির জন্য অতিরিক্ত অ্যাপলের এক্সটেনশনের

আরও পড়া হিসাবে আমি বিভিন্ন চিত্র পুনরায় আকার দেওয়ার কৌশলগুলির জন্য এই নিবন্ধটি পরীক্ষা করার পরামর্শ দিচ্ছি । বর্তমান পদ্ধতির শালীন কর্মক্ষমতা উপলব্ধ করা হয়, এটি উচ্চ-স্তরের এপিআই এবং বোঝার জন্য সহজ পরিচালনা করে। আমি যদি আপনি দেখতে না পান যে চিত্রের আকার পরিবর্তন করা আপনার কর্মক্ষমতাতে কোনও বাধা unless


1

কেবলমাত্র অনুপাতের অনুপাতের সাথে আপনাকে প্রস্থ / উচ্চতাকে পুনরায় আকার দেওয়ার প্রয়োজন হলে এই এক্সটেনশনটি ব্যবহার করুন।

extension UIImage {
    func resize(to size: CGSize) -> UIImage {
        return UIGraphicsImageRenderer(size: size).image { _ in
            draw(in: CGRect(origin: .zero, size: size))
        }
    }
    func resize(width: CGFloat) -> UIImage {
        return resize(to: CGSize(width: width, height: width / (size.width / size.height)))
    }
    func resize(height: CGFloat) -> UIImage {
        return resize(to: CGSize(width: height * (size.width / size.height), height: height))
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.