অ্যাসপেক্ট রেশিও এবং প্রস্থ রেখে UIImage এর আকার পরিবর্তন করুন


136

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

উত্তর:


228

শ্রীকারের পদ্ধতিটি খুব ভালভাবে কাজ করে, যদি আপনি নিজের নতুন আকারের উচ্চতা এবং প্রস্থতা উভয়ই জানেন । যদি আপনি উদাহরণস্বরূপ কেবলমাত্র প্রশস্ততা জানেন তবে আপনি যে উচ্চতাতে স্কেল করতে চান এবং উচ্চতার স্কেল ফ্যাক্টরটি প্রথমে গণনা করতে হবে সে সম্পর্কে আপনি যত্ন নিতে না চান।

+(UIImage*)imageWithImage: (UIImage*) sourceImage scaledToWidth: (float) i_width
{
    float oldWidth = sourceImage.size.width;
    float scaleFactor = i_width / oldWidth;

    float newHeight = sourceImage.size.height * scaleFactor;
    float newWidth = oldWidth * scaleFactor;

    UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight));
    [sourceImage drawInRect:CGRectMake(0, 0, newWidth, newHeight)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();    
    UIGraphicsEndImageContext();
    return newImage;
}

22
আপনার newWidthএখানে সত্যিকারের পরিবর্তকের দরকার নেই যদিও এটি ইতিমধ্যে i_width
ম্যাথু কুইরোস

2
আপনাকে উচ্চতার
দ্বারাও বিভাজন

1
আমি যদি আমার উচ্চতার অনুপাতটিও জানতে এবং প্রস্থ বা উচ্চতা উভয়ই স্কেল করে ফিট করতে চাই তবে আমাকে উচ্চতার দ্বারা বিভক্ত করতে হবে। তবে যেহেতু টিও অনুপাত এবং প্রস্থ রক্ষা করার জন্য স্পষ্টভাবে জিজ্ঞাসা করেছিল, এবং প্রস্থ বা উচ্চতা নয়, আমার উত্তর পুরোপুরি সঠিক।
ম্যাভেরিক

12
দুর্দান্ত উত্তর, ধন্যবাদ। আরও একটি জিনিস: আপনি যদি এই পদ্ধতিটি ব্যবহার করে চিত্রের মানের কোনও ক্ষয়ক্ষতি অনুভব করেন তবে UIGraphicsBeginImageContextWithOptions(CGSizeMake(newWidth, newHeight), NO, 0);বরং ব্যবহার করুনUIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight));
স্কর্নোস

57

যদি চিত্রটি প্রতিকৃতি বা ল্যান্ডস্কেপ হবে (উদাহরণস্বরূপ ব্যবহারকারী ক্যামেরার সাহায্যে ছবি তোলেন) তা আপনি যদি না জানেন তবে আমি আরও একটি পদ্ধতি তৈরি করেছি যা সর্বোচ্চ প্রস্থ এবং উচ্চতার পরামিতি নেয়।

বলুন যে আপনার কাছে UIImage *myLargeImageএকটি 4: 3 অনুপাত।

UIImage *myResizedImage = [ImageUtilities imageWithImage:myLargeImage 
                                        scaledToMaxWidth:1024 
                                               maxHeight:1024];

ল্যান্ডস্কেপ হলে পুনরায় পরিবর্তিত ইউআইআইজেজ হবে 1024x768; 768x1024 প্রতিকৃতি হলে। এই পদ্ধতিটি রেটিনা প্রদর্শনের জন্য উচ্চতর রেজ-ইমেজ তৈরি করবে।

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

    return newImage;
}

+ (UIImage *)imageWithImage:(UIImage *)image scaledToMaxWidth:(CGFloat)width maxHeight:(CGFloat)height {
    CGFloat oldWidth = image.size.width;
    CGFloat oldHeight = image.size.height;

    CGFloat scaleFactor = (oldWidth > oldHeight) ? width / oldWidth : height / oldHeight;

    CGFloat newHeight = oldHeight * scaleFactor;
    CGFloat newWidth = oldWidth * scaleFactor;
    CGSize newSize = CGSizeMake(newWidth, newHeight);

    return [ImageUtilities imageWithImage:image scaledToSize:newSize];
}

1
এটি সেরা জিনিস তবে এটি সর্বদা আমার সংজ্ঞায়িত আকারের দ্বিগুণ ফিরে আসে
মাশহাদি

2
আপনি যদি কেবল ডাউনসাইজিং চান, আপসাইজিং না করেন তবে চিত্রটি শুরু করতে ভুলবেন না উইথ ইমেজ: স্কেলড টোম্যাক্স উইথ: সর্বাধিক উচ্চতা: পদ্ধতি সহ: যদি (চিত্র.সাইজ.উইদথ <প্রস্থ && চিত্র.সাইজ.হাইট <উচ্চতা) image চিত্রটি রিটার্ন করুন; }
আরজান

5
একটি সর্বোচ্চ প্রস্থ এবং সর্বোচ্চ উচ্চতা মধ্যে মাপসই করার জন্য, আপনাকে স্কেল ফ্যাক্টর হিসেবে ন্যূনতম অনুপাত প্রয়োজন: min(ratioX, ratioY)। অন্যথায়, প্রস্থ বৃহত্তর হলে, এটি সর্বোচ্চ উচ্চতার সাথে মাপসই করা যায় না।
জেসন 22

ইমেজ ইউটিলিটিস এটি কোথায়?
টং

42

সেরা উত্তর ম্যাভেরিক 1 মের সঠিকভাবে সুইফটে অনুবাদ হয়েছে (সর্বশেষ সুইফ্ট 3 এর সাথে কাজ করা ):

func imageWithImage (sourceImage:UIImage, scaledToWidth: CGFloat) -> UIImage {
    let oldWidth = sourceImage.size.width
    let scaleFactor = scaledToWidth / oldWidth

    let newHeight = sourceImage.size.height * scaleFactor
    let newWidth = oldWidth * scaleFactor

    UIGraphicsBeginImageContext(CGSize(width:newWidth, height:newHeight))
    sourceImage.draw(in: CGRect(x:0, y:0, width:newWidth, height:newHeight))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage!
}

38

ধন্যবাদ @ ম্যাভারিক 1 প্রথম অ্যালগরিদমকে, আমি এটি প্রয়োগ করেছি Swift, আমার ক্ষেত্রে উচ্চতা ইনপুট পরামিতি

class func resizeImage(image: UIImage, newHeight: CGFloat) -> UIImage {

    let scale = newHeight / image.size.height
    let newWidth = image.size.width * scale
    UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight))
    image.drawInRect(CGRectMake(0, 0, newWidth, newHeight))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage
}

18

এই পদ্ধতিটি ইউআইআইমেজের একটি বিভাগ। AVFoundation ব্যবহার করে কোডের কয়েকটি লাইনে স্কেল ফিট করে। আমদানি করতে ভুলবেন না #import <AVFoundation/AVFoundation.h>

@implementation UIImage (Helper)

- (UIImage *)imageScaledToFitToSize:(CGSize)size
{
    CGRect scaledRect = AVMakeRectWithAspectRatioInsideRect(self.size, CGRectMake(0, 0, size.width, size.height));
    UIGraphicsBeginImageContextWithOptions(size, NO, 0);
    [self drawInRect:scaledRect];
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return scaledImage;
}

@end

2
আমার কাছে সবচেয়ে ছোট মেমরির পদচিহ্নগুলি সহ সেরা ফলাফল দেওয়ার জন্য এটি পাওয়া গেছে। +1
টমমি সি

11

@ জ্যানোসের উত্তরের উপর ভিত্তি করে দিক-ফিট-থেকে- উচ্চতার 5 টি সংস্করণ সুইফট করুন

আধুনিক UIGraphicsImageRendererএপিআই ব্যবহার করে , সুতরাং একটি বৈধ UIImageফেরতের গ্যারান্টিযুক্ত।

extension UIImage
{
    /// Given a required height, returns a (rasterised) copy
    /// of the image, aspect-fitted to that height.

    func aspectFittedToHeight(_ newHeight: CGFloat) -> UIImage
    {
        let scale = newHeight / self.size.height
        let newWidth = self.size.width * scale
        let newSize = CGSize(width: newWidth, height: newHeight)
        let renderer = UIGraphicsImageRenderer(size: newSize)

        return renderer.image { _ in
            self.draw(in: CGRect(origin: .zero, size: newSize))
        }
    }
}

আপনি যেকোন রেন্ডার আকারে মান সংরক্ষণের জন্য (ভেক্টর-ভিত্তিক) পিডিএফ চিত্র সম্পদটির সাথে একত্রে এটি ব্যবহার করতে পারেন।


7

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

কোডটি এর মতো হয় - এটি কোনও ইউটিলিটি পদ্ধতি হিসাবে ব্যবহার করা যেতে পারে -

+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize
{
    UIGraphicsBeginImageContext(newSize);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();    
    UIGraphicsEndImageContext();
    return newImage;
}

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

6

প্রোগ্রামেটিক্যালি:

imageView.contentMode = UIViewContentModeScaleAspectFit;

স্টোরিবোর্ড:

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


এটি কার্যকর হয়, তবে মেমরির পদচিহ্নগুলি হ্রাস করে, আপনি অ্যাপ্লিকেশনটিকে দ্রুত কাজ করতে পারেন, উদাহরণস্বরূপ প্রচুর থাম্বনেইল লোড করা।
ingconti

এটি একটি ইউআইআইমেজভিউ, কোনও ইউআইআইমেজ নয়। কখনও কখনও, আপনাকে ইউআইআইমেজভিউ ছাড়া অঙ্কন করতে হবে।
ওম্বল

5

ওয়েল, চিত্রের আকার পরিবর্তন করার জন্য আমাদের কাছে এখানে কয়েকটি ভাল উত্তর রয়েছে তবে আমি কেবল আমার প্রয়োজন অনুসারে পরিবর্তন করছি ify আশা করি এটি আমার মতো কাউকে সহায়তা করবে।

আমার প্রয়োজন ছিল

  1. যদি চিত্রের প্রস্থ 1920 এর বেশি হয় তবে এটি 1920 প্রস্থের সাথে আকার দিন এবং মূল অনুপাত অনুপাত সহ উচ্চতা বজায় রাখুন।
  2. চিত্রের উচ্চতা যদি 1080 এর বেশি হয় তবে এটির 1080 আকার এবং আকারের মূল অনুপাত সহ প্রস্থ রক্ষা করুন res

 if (originalImage.size.width > 1920)
 {
        CGSize newSize;
        newSize.width = 1920;
        newSize.height = (1920 * originalImage.size.height) / originalImage.size.width;
        originalImage = [ProfileEditExperienceViewController imageWithImage:originalImage scaledToSize:newSize];        
 }

 if (originalImage.size.height > 1080)
 {
            CGSize newSize;
            newSize.width = (1080 * originalImage.size.width) / originalImage.size.height;
            newSize.height = 1080;
            originalImage = [ProfileEditExperienceViewController imageWithImage:originalImage scaledToSize:newSize];

 }

+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize
{
        UIGraphicsBeginImageContext(newSize);
        [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return newImage;
}

@ শ্রীকার অ্যাপলকে ধন্যবাদ , পুনরায় আকার দেওয়ার জন্য আমি তার পদ্ধতিটি ব্যবহার করেছি।

আপনি চেক করতে পছন্দ করতে পারেন এই হিসাবে ভাল পুনরায় আকার দেওয়ার গণনা জন্য।


4

কেবল এভিফাউন্ডেশন এবং ব্যবহার আমদানি করুন AVMakeRectWithAspectRatioInsideRect(CGRectCurrentSize, CGRectMake(0, 0, YOUR_WIDTH, CGFLOAT_MAX)


2

রায়ের উত্তরের উন্নতি করতে:

   + (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)size {
CGFloat oldWidth = image.size.width;
        CGFloat oldHeight = image.size.height;

//You may need to take some retina adjustments into consideration here
        CGFloat scaleFactor = (oldWidth > oldHeight) ? width / oldWidth : height / oldHeight;

return [UIImage imageWithCGImage:image.CGImage scale:scaleFactor orientation:UIImageOrientationUp];
    }

2
extension UIImage {

    /// Returns a image that fills in newSize
    func resizedImage(newSize: CGSize) -> UIImage? {
        guard size != newSize else { return self }

    let hasAlpha = false
    let scale: CGFloat = 0.0
    UIGraphicsBeginImageContextWithOptions(newSize, !hasAlpha, scale)
        UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)

        draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
        let newImage: UIImage? = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage
    }

    /// Returns a resized image that fits in rectSize, keeping it's aspect ratio
    /// Note that the new image size is not rectSize, but within it.
    func resizedImageWithinRect(rectSize: CGSize) -> UIImage? {
        let widthFactor = size.width / rectSize.width
        let heightFactor = size.height / rectSize.height

        var resizeFactor = widthFactor
        if size.height > size.width {
            resizeFactor = heightFactor
        }

        let newSize = CGSize(width: size.width / resizeFactor, height: size.height / resizeFactor)
        let resized = resizedImage(newSize: newSize)

        return resized
    }
}

স্কেল 0.0 এ সেট করা থাকলে, মূল পর্দার স্কেল ফ্যাক্টর ব্যবহার করা হয়, যা রেটিনা প্রদর্শনগুলির জন্য 2.0 বা উচ্চতর (আইফোন 6 প্লাসের 3.0) on


1

রায়ানের সলিউশন সুইট কোডে রায়ান

ব্যবহার করুন:

 func imageWithSize(image: UIImage,size: CGSize)->UIImage{
    if UIScreen.mainScreen().respondsToSelector("scale"){
        UIGraphicsBeginImageContextWithOptions(size,false,UIScreen.mainScreen().scale);
    }
    else
    {
         UIGraphicsBeginImageContext(size);
    }

    image.drawInRect(CGRectMake(0, 0, size.width, size.height));
    var newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}

//Summon this function VVV
func resizeImageWithAspect(image: UIImage,scaledToMaxWidth width:CGFloat,maxHeight height :CGFloat)->UIImage
{
    let oldWidth = image.size.width;
    let oldHeight = image.size.height;

    let scaleFactor = (oldWidth > oldHeight) ? width / oldWidth : height / oldHeight;

    let newHeight = oldHeight * scaleFactor;
    let newWidth = oldWidth * scaleFactor;
    let newSize = CGSizeMake(newWidth, newHeight);

    return imageWithSize(image, size: newSize);
}

1

ইন সুইফট 3 কিছু পরিবর্তন আছে। এখানে ইউআইআইমেজ এর একটি এক্সটেনশান:

public extension UIImage {
    public func resize(height: CGFloat) -> UIImage? {
        let scale = height / self.size.height
        let width = self.size.width * scale
        UIGraphicsBeginImageContext(CGSize(width: width, height: height))
        self.draw(in: CGRect(x:0, y:0, width:width, height:height))
        let resultImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return resultImage
    }
}

1

ছোট উন্নতির সাথে জিশান তুফাইল এবং উম্বলের উত্তর 5 ift যে maxLengthকোনও মাত্রা এবং জেপিগ সংক্ষেপণের চিত্রকে স্কেল করতে এখানে আমাদের কাছে দুটি ফাংশন সহ এক্সটেনশন রয়েছে ।

extension UIImage {
    func aspectFittedToMaxLengthData(maxLength: CGFloat, compressionQuality: CGFloat) -> Data {
        let scale = maxLength / max(self.size.height, self.size.width)
        let format = UIGraphicsImageRendererFormat()
        format.scale = scale
        let renderer = UIGraphicsImageRenderer(size: self.size, format: format)
        return renderer.jpegData(withCompressionQuality: compressionQuality) { context in
            self.draw(in: CGRect(origin: .zero, size: self.size))
        }
    }
    func aspectFittedToMaxLengthImage(maxLength: CGFloat, compressionQuality: CGFloat) -> UIImage? {
        let newImageData = aspectFittedToMaxLengthData(maxLength: maxLength, compressionQuality: compressionQuality)
        return UIImage(data: newImageData)
    }
}

0

এই এক আমার জন্য নিখুঁত ছিল। দিক অনুপাত রাখে এবং গ্রহণ করে a maxLength। প্রস্থ বা উচ্চতা এর চেয়ে বেশি হবে নাmaxLength

-(UIImage*)imageWithImage: (UIImage*) sourceImage maxLength: (float) maxLength
{
    CGFloat scaleFactor = maxLength / MAX(sourceImage.size.width, sourceImage.size.height);

    float newHeight = sourceImage.size.height * scaleFactor;
    float newWidth = sourceImage.size.width * scaleFactor;

    UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight));
    [sourceImage drawInRect:CGRectMake(0, 0, newWidth, newHeight)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

0

উপলব্ধ প্রস্থের জন্য চিত্রের সর্বোত্তম উচ্চতা গণনা করে।

import Foundation

public extension UIImage {
    public func height(forWidth width: CGFloat) -> CGFloat {
        let boundingRect = CGRect(
            x: 0,
            y: 0,
            width: width,
            height: CGFloat(MAXFLOAT)
        )
        let rect = AVMakeRect(
            aspectRatio: size,
            insideRect: boundingRect
        )
        return rect.size.height
    }
}

-1

আমি এটিকে অনেক সহজ উপায়ে সমাধান করেছি

UIImage *placeholder = [UIImage imageNamed:@"OriginalImage.png"];
self.yourImageview.image = [UIImage imageWithCGImage:[placeholder CGImage] scale:(placeholder.scale * 1.5)
                                  orientation:(placeholder.imageOrientation)];

স্কেলের গুণক ইমেজটির স্কেলিং সংজ্ঞায়িত করবে, আরও গুণকটি চিত্রটি আরও ছোট করবে। যাতে আপনার স্ক্রিনটি কী ফিট করে তা পরীক্ষা করতে পারেন।

অথবা আপনি ইমেজউইথ / স্ক্রিনউইথকে ভাগ করেও গুণকটি পেতে পারেন।

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