करने के लिए नीचे एक UIImage पैमाने पर करने को देखते हुए एक UIImage किसी भी आयाम की, मैं एक वर्ग "आइकन" आकार के संस्करण, एक तरफ करने के लिए px
पिक्सल उत्पन्न करने के लिए चाहते हैं किसी भी विकृति (खींच) के बिना। हालांकि, मैं थोड़ा सा झुकाव में भाग रहा हूँ। बिल्कुल यकीन नहीं है कि समस्या कहां है। यहां मैं अभी तक क्या कर रहा हूं।UIRectClip का उचित उपयोग आइकन आकार
, सबसे पहले एक UImagesize
को देखते हुए, मैं तीन बातें निर्धारित: जब नीचे छवि स्केलिंग ratio
उपयोग करने के लिए; एक delta
, और एक offset
(हमारे वांछित आइकन आकार और लंबाई की ओर के बीच अंतर) (जो यह पता लगाने के लिए किया जाता हमारे मूल समन्वय जब छवि कतरन):
if (size.width > size.height) {
ratio = px/size.width;
delta = (ratio*size.width - ratio*size.height);
offset = CGPointMake(delta/2, 0);
} else {
ratio = px/size.height;
delta = (ratio*size.height - ratio*size.width);
offset = CGPointMake(0, delta/2);
}
अब मान लें कि आप एक छवि है चलो 480px उच्च द्वारा 640px चौड़ा, और हम इसमें से 50px x 50px आइकन प्राप्त करना चाहते हैं। चौड़ाई ऊंचाई से अधिक है, तो हमारी गणना कर रहे हैं:
ratio = 50px/640px = 0.078125
delta = (ratio * 640px) - (ratio * 480px) = 50px - 37.5px = 12.5px
offset = {x=6.25, y=0}
इसके बाद, मैं बनाने के एक CGRectrect
कि इतना बड़ा विरूपण के बिना हमारे वांछित आइकन आकार, प्लस कतरन के लिए एक clipRect
करने के लिए नीचे कट जाने की है प्रयोजनों:
CGRect rect = CGRectMake(0.0, 0.0, (ratio * size.width) + delta,
(ratio * size.height) + delta);
CGRect clipRect = CGRectMake(offset.x, offset.y, px, px);
ऊपर से हमारे मूल्यों को प्रतिस्थापित करने पर, हम पाते हैं:
rect = origin {x=0.0, y=0.0}, size {width=62.5, height=50.0}
clipRect = origin {x=6.25, y=0}, size {width=50.0, height=50.0}
तो अब हमारे पास काम करने के लिए 50 पीएक्स उच्च आयत द्वारा 62.5 पीएक्स चौड़ा है, और एक क्लिपिंग आयताकार जो "मध्य" 50x50 भाग को पकड़ता है।
घर के खिंचाव पर! इसके बाद, हमने अपना चित्र संदर्भ स्थापित किया है, UIImage (जिसे myImage
यहां कहा जाता है) को रेक्ट में सेट करें, क्लिपिंग आयत सेट करें, इसे (संभवतः अब-क्लिप) छवि प्राप्त करें, इसका उपयोग करें, और अंततः हमारे छवि संदर्भ को साफ़ करें:
UIGraphicsBeginImageContext(rect.size);
[myImage drawInRect:rect];
UIRectClip(clipRect);
UIImage *icon = UIGraphicsGetImageFromCurrentImageContext();
// Do something with the icon here ...
UIGraphicsEndImageContext();
केवल एक समस्या: क्लिपिंग कभी नहीं होती! मैं एक छवि 63px चौड़ा x 50px उच्च के साथ समाप्त होता है। :(
शायद मैं UIRectClip का दुरुपयोग/गलतफहमी कर रहा हूं? मैंने विभिन्न चीजों को चारों ओर घूमने की कोशिश की है: rect
और clipRect
के उपयोग को स्वैप करना, ड्राइन्रैक्ट से पहले। कोई पाँसा नहीं।
मैंने इस विधि के उदाहरण के लिए ऑनलाइन खोज करने की कोशिश की, इसका कोई फायदा नहीं हुआ।
द्वारा वर्तमान कतरन पथ निर्दिष्ट आयत के साथ अन्तर्विभाजक संशोधित करता है: रिकॉर्ड के लिए, UIRectClip के रूप में परिभाषित किया गया है।
फेरबदल बातें हमें हो जाता है एक छोटा सा करीब चारों ओर:
UIGraphicsBeginImageContext(clipRect.size);
UIRectClip(rect);
[myImage drawInRect:rect];
अब हम विरूपण की जरूरत नहीं है, लेकिन काटा छवि मूल पर केंद्रित नहीं है के रूप में मैं उम्मीद थी।फिर भी, कम से कम छवि 50x50 है, हालांकि परिवर्तनीय नाम अब शफल होने के परिणामस्वरूप फूले हुए हैं। (मैं सम्मानपूर्वक पाठक के लिए अभ्यास के रूप में नामांकन छोड़ दूंगा।)
इस साझा करने के लिए धन्यवाद! यह थोड़ी देर हो गया है क्योंकि मैंने देखा है कि मैंने क्या समाप्त किया था। मैं निश्चित रूप से अपनी विधि का उपयोग कर किसी विकृति के लिए नहीं चाहता था या इरादा नहीं चाहता था। आपका "सबसे बड़ा संभव वर्ग" समझदार लगता है, और मैं यूआईआरईटीक्लिप को जरूरी नहीं सुन रहा हूं। (अन्य पाठक, कृपया वजन लें और देखें कि यह आपके लिए कैसे उड़ता है!) –
धन्यवाद, विशेष रूप से वाक्य के लिए "यूआईसीएलआईपीआरईटी का उपयोग करना भी जरूरी नहीं है - यदि आप संदर्भ को उस छवि का आकार बनाते हैं जिसे आप निकालना चाहते हैं, वैसे भी उस रेक्ट के बाहर कोई वास्तविक चित्र नहीं किया जाएगा " – xaphod