2011-10-04 22 views
112

रखकर UIImage का आकार बदलें मैंने पहलू अनुपात को रखकर छवि का आकार बदलने के लिए कई पदों में देखा। ये फ़ंक्शन आकार बदलने के दौरान आरईसीटी के लिए निश्चित बिंदु (चौड़ाई और ऊंचाई) का उपयोग करता है। लेकिन मेरी परियोजना में, मुझे अकेले चौड़ाई के आधार पर दृश्य का आकार बदलने की जरूरत है, ऊंचाई अनुपात के आधार पर ऊंचाई स्वचालित रूप से लेनी चाहिए। कोई भी इसे प्राप्त करने में मेरी सहायता करता है।पहलू अनुपात और चौड़ाई

उत्तर

215

Srikar की विधि बहुत अच्छी तरह से काम करता है, अगर आप दोनों ऊंचाई अपने नए आकार की और चौड़ाई पता है। यदि आप उदाहरण के लिए केवल उस चौड़ाई को जानते हैं जिसे आप स्केल करना चाहते हैं और ऊंचाई की परवाह नहीं करते हैं तो आपको ऊंचाई के स्केल कारक की गणना करना होगा।

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

आपको वास्तव में 'newWidth' चर की आवश्यकता नहीं है, हालांकि यह पहले से ही 'i_width' है। –

+2

आपको ऊंचाई से भी विभाजित करने की आवश्यकता है और जो भी 0 के करीब है, स्केलिंग कारकों की तुलना करें। उपर्युक्त कोड केवल उन छवियों के साथ काम करेगा जो उच्च हैं – IceForge

+1

यदि मैं चाहता हूं कि मुझे ऊंचाई से विभाजित करने की आवश्यकता होगी मेरी ऊंचाई अनुपात को भी जानें और चौड़ाई या ऊंचाई को स्केल करके फिट करें। लेकिन चूंकि टीओ ने अनुपात और चौड़ाई को रखने के लिए स्पष्ट रूप से पूछा, और चौड़ाई या ऊंचाई नहीं, मेरा जवाब पूरी तरह से सही है। – Maverick1st

8

सबसे आसान तरीका है अपने 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; 
} 
+0

से अधिक नहीं होगी, मैं इसे 'सामग्री मोड' सेट करने के साथ काम करने में कामयाब रहा। –

54

आप जानना चाहते हैं कि छवि पोर्ट्रेट या लैंडस्केप हो जाएगा ऐसा नहीं करते हैं तो (उदाहरण, उपयोगकर्ता कैमरे के साथ तस्वीर लेता है), मैं एक और तरीका है कि अधिकतम चौड़ाई और ऊंचाई पैरामीटर लेता बनाया।

मान लें कि आपके पास UIImage *myLargeImage है जो 4: 3 अनुपात है।

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

आकार बदलने पर UIImage 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]; 
} 
+0

धन्यवाद। यह ठीक वही है जिसकी तलाश मुझे थी! – SeanK

+0

आपको बहुत धन्यवाद! – 4GetFullOf

+1

यह सबसे अच्छी बात है लेकिन यह हमेशा मेरे परिभाषित आकार – Mashhadi

4

बस AVFoundation के आयात और 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]; 
    } 
31

धन्यवाद @ Maverick1st एल्गोरिथ्म, मैं इसे 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 
} 
15

यह विधि UIImage पर एक श्रेणी है। 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 –

+1

शानदार शानदार, बहुत बहुत धन्यवाद। –

1

तेज कोड में रयान के समाधान @Ryan

उपयोग:

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

ठीक है, हम यहाँ छवि का आकार बदलने के लिए कुछ अच्छा जवाब है, लेकिन मैं सिर्फ अपनी जरूरत के अनुसार संशोधित। उम्मीद है कि यह मेरे जैसे किसी की मदद करेगा।

मेरे आवश्यकता

  1. था तो छवि चौड़ाई 1920 से भी अधिक है, 1920 की चौड़ाई और मूल पहलू अनुपात के साथ बनाए रखने के ऊंचाई के साथ उसका आकार बदलने के।
  2. यदि छवि ऊंचाई 1080 से अधिक है, तो इसे 1080 ऊंचाई के साथ आकार दें और मूल पहलू अनुपात के साथ चौड़ाई बनाए रखें। करने के लिए @

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

धन्यवाद Srikar Appal, आकार बदलने के लिए मैं अपनी विधि का इस्तेमाल किया है।

आप this के साथ-साथ आकार बदलने के लिए भी जांच सकते हैं।

0

मैं एक बहुत सरल तरीका पैमाने के

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

गुणक छवि के scalling परिभाषित करेगा, और अधिक गुणक छोटी छवि में इसे हल कर दिया है। तो आप जांच सकते हैं कि आपकी स्क्रीन क्या फिट बैठती है।

या आप छविविड्थ/स्क्रीनविड्थ को विभाजित करके गुणक भी प्राप्त कर सकते हैं।

32

सर्वश्रेष्ठ उत्तर मेवरिक 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! 
} 
5

प्रोग्राम:

imageView.contentMode = UIViewContentModeScaleAspectFit; 

स्टोरीबोर्ड:

enter image description here

0

स्विफ्ट 3 कुछ बदलाव हैं। यहाँ UIImage करने के लिए एक विस्तार है:

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

यह एक मेरे लिए एकदम सही था। पहलू अनुपात रखता है और 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; 
} 
संबंधित मुद्दे