2011-11-16 4 views
10

की आप ग्राफिक्स विशेषज्ञों सभी के लिए, मैं सोच रहा था जो इन दोनों तरीकों में से एक एक UIImage आकार बदलने के लिए बेहतर है:UIImage का आकार बदलने का कौन सा तरीका बेहतर है और क्यों?

-(UIImage *)resizeImage:(UIImage *)image width:(CGFloat)resizedWidth height:(CGFloat)resizedHeight 
{ 
    UIGraphicsBeginImageContext(CGSizeMake(resizedWidth ,resizedHeight)); 
    [image drawInRect:CGRectMake(0, 0, resizedWidth, resizedHeight)]; 
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();     
    UIGraphicsEndImageContext(); 
    return result; 
} 
:

पहले एक मैं का सामना करना पड़ा सरल और लोकप्रिय है और पीछा कर रहा है

दूसरी विधि मैं इस लिंक http://iphonesdksnippets.com/post/2009/05/06/Resize-image-and-keep-aspect-ratio.aspx में पाया जाता है और इसके बाद के संस्करण के रूप में ही पूरा करने के लिए लगता है, लेकिन और अधिक जटिल (मैं वास्तव में समझ में नहीं आता क्या उस में चल रहा है) है:

-(UIImage *)resizeImage:(UIImage *)image width:(CGFloat)resizedWidth height:(CGFloat)resizedHeight 
{ 
    CGImageRef imageRef = [image CGImage]; 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef bitmap = CGBitmapContextCreate(NULL, resizedWidth, resizedHeight, 8, 4 * resizedWidth, colorSpace, kCGImageAlphaPremultipliedFirst); 
    CGContextDrawImage(bitmap, CGRectMake(0, 0, resizedWidth, resizedHeight), imageRef); 
    CGImageRef ref = CGBitmapContextCreateImage(bitmap); 
    UIImage *result = [UIImage imageWithCGImage:ref]; 

    CGContextRelease(bitmap); 
    CGImageRelease(ref); 

    return result; 
} 

तो मीटर वाई सवाल यह है कि, किस तरह से बेहतर है और क्यों?

उत्तर

0

यह एक उच्च स्तरीय और निम्न-स्तर का दृष्टिकोण है।

कौन सा बेहतर है? आपके लक्ष्य पर निर्भर करता है।

उच्च स्तरीय दृष्टिकोण अधिक पठनीय (मेरे लिए) है, शायद निम्न स्तर का दृष्टिकोण एक नैनोसेकंद तेज़ है (इसका परीक्षण नहीं किया गया)।

यह एल्गोरिदम का न्याय करना मुश्किल है ...

+0

निम्न स्तर दृष्टिकोण = आकार बदलने के बाद गुणवत्ता को बेहतर बनाए रखें? @tom –

+0

मुझे लगता है कि UIImage की drawInRect विधि आंतरिक रूप से CGContextDrawImage का उपयोग करेगी ... – Tom

4

दूसरा एक धागा सुरक्षित है।

+1

यह क्यों कम हो गया है? 1: बकाया बयान गलत है? 2: क्योंकि थ्रेडिंग अप्रासंगिक है -> यह नहीं है। यदि आप एक उच्च प्रदर्शन ऐप चाहते हैं, तो आकार बदलने वाले कार्यों को किसी अन्य थ्रेड में रखना एक अच्छा तरीका है। – esbenr

1

यह एक देर से उत्तर है, लेकिन मैं आगे बढ़ जाऊंगा और इसे किसी भी तरह से जोड़ूंगा।

मुझे वास्तव में प्रीस्टास्टा के अलावा, दो विधियों के बीच कुछ व्यवहारिक अंतर मिले।

मेरा एक फोटो ऐप में, मेरे पास कस्टम कैमरा दृश्य है जो किसी भी छवि को कस्टम छवि संपादक को भेजता है। ऐप में, कस्टम कैमरा/संपादक दृश्य अनन्य हैं। हालांकि, देशी कैमरा खिड़की खुद ही नहीं है।

तो, जब भी चित्र चित्र में एक तस्वीर ली जाती है, तो अंतिम परिणाम विकृत हो जाता है। चौड़ाई < ऊंचाई चौड़ाई, जब भी चौड़ाई और ऊंचाई flipping द्वारा इन विकृतियों को आसानी से संभाला जाता है।

उपरोक्त दो तरीकों (सरल एक) की पहली विधि के परिणामस्वरूप एक छवि जो 9 0 डिग्री घूर्णन की गई और अभी भी विकृत हो गई। दूसरा, हालांकि, पूरी तरह से छवि का आकार बदल गया!

मुझे लगता है कि इसमें ग्राफिक्स संदर्भ-आधारित व्यवहार के साथ कुछ करना है। दूसरी विधि इस संदर्भ का उपयोग नहीं करती है, और यह मेरे मामले में निर्दोष रूप से काम करती है।

0

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

एक ऐसी परियोजना है जिसमें ऐसा करने के लिए एक स्वच्छ एपीआई है: https://github.com/mustangostang/UIImage-Resize। यह पहला दृष्टिकोण उपयोग करता है :-)

संबंधित मुद्दे