2011-05-21 28 views
14

जब हम (डाउनलोड करने के बाद और उस दस्तावेज़ निर्देशिका में भंडारण से पहले) छवि का आकार बदलने के लिए, निम्न कोड से जोड़ दिया गया है पतली सफेद रेखा इसके अभिविन्यास की ओर जोड़ दी गई है (जैसे कि छवि परिदृश्य सफेद रेखा को इसके नीचे जोड़ा गया है और यदि छवि चित्रित है तो सफेद रेखा को उसके दाहिने हाथ में जोड़ा जाता है)।एक पतली Whiteline जब छवि का आकार

कृपया बताएं कि, उस सफेद रेखा से कैसे छुटकारा पाएं?

धन्यवाद।

+1

[resizedImage रिहाई]; एक ऐसी वस्तु को जारी कर रहा है जिसका आपके पास स्वामित्व नहीं है। – MattyG

उत्तर

19

हालांकि आकार फ्लोटिंग पॉइंट इकाइयों में निर्दिष्ट है, वास्तविक छवि हमेशा पिक्सल की एक अभिन्न संख्या है।

जब आप पहलू अनुपात को संरक्षित करने के लिए नए आकार की गणना करते हैं, तो आमतौर पर आपके पास केवल पिक्सेल की पूरी संख्या के रूप में पक्षों में से एक होता है, जबकि अन्य तराजू में कुछ अंश भाग होता है। जब आप उस आय में पुरानी छवि खींचते हैं, तो यह नई छवि को काफी भरता नहीं है। तो आप एक सफेद रेखा के रूप में क्या देखते हैं, ग्राफिक्स सिस्टम का हिस्सा पिक्सेल को प्रतिपादित करने का तरीका है जो भाग छवि, भाग पृष्ठभूमि हैं।

संक्षेप में, आप जो करना चाहते हैं वह काफी संभव नहीं है, इसलिए आपको इसे किसी भी तरह से खराब करना होगा। वहाँ कई संभावनाएं हैं:

  • स्केल छवि इस तरह के पहलू अनुपात पूरी तरह से संरक्षित नहीं किया गया है कि लेकिन आप गोलाई से अभिन्न मान है, उदाहरण के लिए:

    actualWidth = round(imgRatio * actualWidth); 
    
  • पहलू अनुपात को बनाए रखने, लेकिन क्लिप आंशिक किनारे।

    UIGraphicsBeginImageContext(CGSizeMake(floor(actualWidth), floor(actualHeight))); 
    [image drawInRect:rect]; 
    
  • बस कुछ रंग है कि सफेद से कम स्पष्ट है के साथ पहली पृष्ठभूमि को भरने: यह करने के लिए सबसे आसान तरीका शायद छवि संदर्भ एक छोटे से छोटा करने के लिए है। यह एक डरावना क्लज है, जाहिर है, लेकिन सही परिस्थितियों में प्रभावी हो सकता है, उदाहरण के लिए यदि आप हमेशा काले रंग की पृष्ठभूमि के खिलाफ छवि खींच रहे हैं।

एक अलग टिप्पणी पर, आप return के बाद कुछ भी फोन नहीं कर सकते, तो अपने अंतिम release लाइन कुछ नहीं कर रहा है। यह भी ठीक है क्योंकि UIGraphicsGetImageFromCurrentImageContext से लौटाई गई छवि स्वचालित है - आपको वैसे भी इसे जारी नहीं किया जाना चाहिए।

+0

यह मेरे लिए बहुत परेशान था! मैं तेजी से उपयोग कर रहा हूं और यह चाल है, धन्यवाद! – blackops

+0

इस उत्तर के लिए धन्यवाद। हम पूरे दिन फ्लोटिंग पॉइंट नंबर से निपटते हैं कि हम छवियों के बारे में कुछ मूल बातें भूल जाते हैं। एक बार फिर धन्यवाद! –

0

यह कोड आपके समस्या का समाधान हो:

+ (UIImage *)scaleImageProportionally:(UIImage *)image { 

if (MAX(image.size.height, image.size.width) <= DEFAULT_PHOTO_MAX_SIZE) { 
    return image; 
} 
else { 
    CGFloat targetWidth = 0; 
    CGFloat targetHeight = 0; 
    if (image.size.height > image.size.width) { 
     CGFloat ratio = image.size.height/image.size.width; 
     targetHeight = DEFAULT_PHOTO_MAX_SIZE; 
     targetWidth = roundf(DEFAULT_PHOTO_MAX_SIZE/ ratio); 
    } 
    else { 
     CGFloat ratio = image.size.width/image.size.height; 
     targetWidth = DEFAULT_PHOTO_MAX_SIZE; 
     targetHeight = roundf(DEFAULT_PHOTO_MAX_SIZE/ ratio); 
    } 

    CGSize targetSize = CGSizeMake(targetWidth, targetHeight); 

    UIImage *sourceImage = image; 
    UIImage *newImage = nil; 

    CGSize imageSize = sourceImage.size; 
    CGFloat width = imageSize.width; 
    CGFloat height = imageSize.height; 

    targetWidth = targetSize.width; 
    targetHeight = targetSize.height; 

    CGFloat scaleFactor = 0.0; 
    CGFloat scaledWidth = targetWidth; 
    CGFloat scaledHeight = targetHeight; 

    CGPoint thumbnailPoint = CGPointMake(0.0, 0.0); 

    if (!CGSizeEqualToSize(imageSize, targetSize)) { 

     CGFloat widthFactor = targetWidth/width; 
     CGFloat heightFactor = targetHeight/height; 

     if (widthFactor < heightFactor) 
      scaleFactor = widthFactor; 
     else 
      scaleFactor = heightFactor; 

     scaledWidth = roundf(width * scaleFactor); 
     scaledHeight = roundf(height * scaleFactor); 

     // center the image 
     if (widthFactor < heightFactor) { 
      thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; 
     } else if (widthFactor > heightFactor) { 
      thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5; 
     } 
    } 

    UIGraphicsBeginImageContext(targetSize); 

    CGRect thumbnailRect = CGRectZero; 
    thumbnailRect.origin = thumbnailPoint; 
    thumbnailRect.size.width = scaledWidth; 
    thumbnailRect.size.height = scaledHeight; 

    [sourceImage drawInRect:thumbnailRect]; 

    newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    if (newImage == nil) NSLog(@"could not scale image"); 

    return newImage; 
} 
} 
+0

http://stackoverflow.com/a/6081650/656600 पहले से ही 2 साल पहले मेरी समस्या को ठीक कर चुका है। लेकिन धन्यवाद जॉर्ज! – rptwsthi

+0

@rptwsthi, लेकिन यह मेरी मदद नहीं करता है :( – George