मुझे मेरी परियोजना में एक अजीब समस्या है। मैं क्या करना चाहता हूं कि, उपयोगकर्ता एक छवि पर ओवरले के रूप में स्वाइप का उपयोग करके पेंट या ड्रॉ करेगा और मुझे केवल चित्रित क्षेत्र के नीचे की छवि से क्षेत्र को फसल करने की आवश्यकता है। मेरा कोड केवल तभी काम कर रहा है जब UIImage
पेंट क्षेत्र से नीचे देखें 320 पिक्सेल चौड़ा यानी आईफोन की चौड़ाई है। लेकिन अगर मैं ImageView
की चौड़ाई बदलता हूं, तो मुझे वांछित परिणाम नहीं मिल रहा है।खींचा गया क्षेत्र सही ढंग से पहचाना नहीं गया
मैं चित्रित भाग के आसपास CGRect
बनाने के लिए निम्न कोड का उपयोग कर रहा हूं।
-(CGRect)detectRectForFaceInImage:(UIImage *)image{
int l,r,t,b;
l = r = t = b = 0;
CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
const UInt8* data = CFDataGetBytePtr(pixelData);
BOOL pixelFound = NO;
for (int i = leftX ; i < rightX; i++) {
for (int j = topY; j < bottomY + 20; j++) {
int pixelInfo = ((image.size.width * j) + i) * 4;
UInt8 alpha = data[pixelInfo + 2];
if (alpha) {
NSLog(@"Left %d", alpha);
l = i;
pixelFound = YES;
break;
}
}
if(pixelFound) break;
}
pixelFound = NO;
for (int i = rightX ; i >= l; i--) {
for (int j = topY; j < bottomY ; j++) {
int pixelInfo = ((image.size.width * j) + i) * 4;
UInt8 alpha = data[pixelInfo + 2];
if (alpha) {
NSLog(@"Right %d", alpha);
r = i;
pixelFound = YES;
break;
}
}
if(pixelFound) break;
}
pixelFound = NO;
for (int i = topY ; i < bottomY ; i++) {
for (int j = l; j < r; j++) {
int pixelInfo = ((image.size.width * i) + j) * 4;
UInt8 alpha = data[pixelInfo + 2];
if (alpha) {
NSLog(@"Top %d", alpha);
t = i;
pixelFound = YES;
break;
}
}
if(pixelFound) break;
}
pixelFound = NO;
for (int i = bottomY ; i >= t; i--) {
for (int j = l; j < r; j++) {
int pixelInfo = ((image.size.width * i) + j) * 4;
UInt8 alpha = data[pixelInfo + 2];
if (alpha) {
NSLog(@"Bottom %d", alpha);
b = i;
pixelFound = YES;
break;
}
}
if(pixelFound) break;
}
CFRelease(pixelData);
return CGRectMake(l, t, r - l, b-t);
}
ऊपर कोड leftX में, rightX, Topy, bottomY नाव में (CGPoint
से) चरम मानों कि जब उपयोगकर्ता स्क्रीन पर अपनी उंगली स्वाइप गणना की जाती है, जबकि चित्रकला और एक आयत जो चित्रित क्षेत्र शामिल है का प्रतिनिधित्व करता है इसकी सीमाओं में (लूप को कम करने के लिए)।
leftX - minimum in X-axis
rightX - maximum in X-axis
topY - min in Y-axis
bottom - max in Y-axis
यहां एल, आर, टी, बी वास्तविक आयताकार के लिए गणना मूल्य हैं।
जैसा कि पहले व्यक्त किया गया था, यह कोड अच्छी तरह से काम करता है जब छविदृश्य जिसमें दर्द होता है 320 पिक्सल चौड़ा होता है और स्क्रीन की चौड़ाई में फैलाया जाता है। लेकिन अगर छविदृश्य की चौड़ाई 300 की तरह छोटी है और स्क्रीन के केंद्र में रखा गया है, तो कोड झूठा परिणाम देता है।
नोट: मैं छविदृश्य की चौड़ाई के अनुसार छवि को स्केल कर रहा हूं।
नीचे NSLog
उत्पादन कर रहे हैं:
जब imageView की चौड़ाई 320 पिक्सेल (ये मिलान किया पिक्सेल या गैर पारदर्शी पिक्सेल में रंग के घटक के लिए मान रहे हैं) है:
2013-05-17 17:58:17.170 FunFace[12103:907] Left 41 2013-05-17 17:58:17.172 FunFace[12103:907] Right 1 2013-05-17 17:58:17.173 FunFace[12103:907] Top 73 2013-05-17 17:58:17.174 FunFace[12103:907] Bottom 12
जब छविदृश्य की चौड़ाई 300 पिक्सेल है:
2013-05-17 17:55:26.066 FunFace[12086:907] Left 42 2013-05-17 17:55:26.067 FunFace[12086:907] Right 255 2013-05-17 17:55:26.069 FunFace[12086:907] Top 42 2013-05-17 17:55:26.071 FunFace[12086:907] Bottom 255
मैं इस समस्या को कैसे हल कर सकता हूं क्योंकि मुझे दोनों तरफ पैडिंग के साथ केंद्र में छविदृश्य की आवश्यकता है।
संपादित करें: ठीक है मेरी समस्या जेपीईजी छवियों (कैमरा से) की छवि अभिविन्यास के कारण है। पीएनजी छवियां अच्छी तरह से काम कर रही हैं और छविदृश्य की चौड़ाई में बदलाव से प्रभावित नहीं हैं। लेकिन फिर भी अगर मैं अभिविन्यास को संभालने में काम कर रहा हूं तो भी जेपीईजी काम नहीं कर रहे हैं।
छवि का आकार क्या है? – Wain
320x240 जब छविदृश्य की चौड़ाई 320 है और जब छविदृश्य की चौड़ाई 300 है तो मैं छवि को 300x225 (जो छविदृश्य का आकार है) को स्केल कर रहा हूं –
क्या आप वास्तव में उस आकार में छवि को फिर से लिख रहे हैं या इसे छवि दृश्य में डाल रहे हैं और छवि दृश्य को स्केल करने की अनुमति देता है? – Wain