2013-05-17 9 views
10

मुझे मेरी परियोजना में एक अजीब समस्या है। मैं क्या करना चाहता हूं कि, उपयोगकर्ता एक छवि पर ओवरले के रूप में स्वाइप का उपयोग करके पेंट या ड्रॉ करेगा और मुझे केवल चित्रित क्षेत्र के नीचे की छवि से क्षेत्र को फसल करने की आवश्यकता है। मेरा कोड केवल तभी काम कर रहा है जब 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 उत्पादन कर रहे हैं:

  1. जब 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 
    
  2. जब छविदृश्य की चौड़ाई 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 
    

मैं इस समस्या को कैसे हल कर सकता हूं क्योंकि मुझे दोनों तरफ पैडिंग के साथ केंद्र में छविदृश्य की आवश्यकता है।

संपादित करें: ठीक है मेरी समस्या जेपीईजी छवियों (कैमरा से) की छवि अभिविन्यास के कारण है। पीएनजी छवियां अच्छी तरह से काम कर रही हैं और छविदृश्य की चौड़ाई में बदलाव से प्रभावित नहीं हैं। लेकिन फिर भी अगर मैं अभिविन्यास को संभालने में काम कर रहा हूं तो भी जेपीईजी काम नहीं कर रहे हैं।

+0

छवि का आकार क्या है? – Wain

+0

320x240 जब छविदृश्य की चौड़ाई 320 है और जब छविदृश्य की चौड़ाई 300 है तो मैं छवि को 300x225 (जो छविदृश्य का आकार है) को स्केल कर रहा हूं –

+0

क्या आप वास्तव में उस आकार में छवि को फिर से लिख रहे हैं या इसे छवि दृश्य में डाल रहे हैं और छवि दृश्य को स्केल करने की अनुमति देता है? – Wain

उत्तर

2

सबसे पहले, मुझे आश्चर्य है कि क्या आप 32-बिट आरजीबीए के अलावा कुछ और एक्सेस कर रहे हैं? डेटा के लिए सूचकांक मान [] को पिक्सेलइन्फो में संग्रहीत किया जाता है, फिर +3 के बजाए +2 बाइट्स चलाता है। वह आपको नीली बाइट पर ले जाएगा। यदि आपका इरादा आरजीबीए का उपयोग करना है, तो यह तथ्य आपके कोड के शेष परिणामों को प्रभावित करेगा।

आगे बढ़ते, एक धारणा है कि आप अभी भी सही अल्फा घटक मूल्य होने के बावजूद त्रुटिपूर्ण परिणाम मिल रहे थे के साथ, यह अपने "तय" कोड कम अल्फा मूल्यों के साथ वाम, ठीक है, ऊपर, नीचे NSLog आउटपुट देना होगा पूर्ण से लगता है -255 पर, 0 के करीब कुछ। इस मामले में, बिना किसी कोड के, मैं सुझाव दूंगा कि आपकी समस्या उस कोड के भीतर है जिसका उपयोग आप अपने 320x240 स्रोत से 300x225 (या शायद किसी अन्य स्केल किए गए आयाम) से छवि को स्केल करने के लिए करते हैं। मैं कल्पना कर सकता हूं कि आपकी छवि में 255 के किनारे अल्फा मान हैं यदि आपका "स्केल" कोड स्केल के बजाए फसल कर रहा है।

+0

मैंने कुछ हद तक समस्या हल की है। कॉलोक को मॉलोक बदलने के बाद नीचे दिए गए लिंक में विधि मेरे लिए काम कर रही है: [link] (http://stackoverflow.com/questions/448125/how-to-get-pixel-data-from-a-uiimage-cocoa- टच-या-सीजीमेज-कोर-ग्राफिक्स) –

+0

लेकिन कभी-कभी मेरा एप्लिकेशन पिक्सल की जांच करते समय क्रैश हो जाता है और मुझे कारण पता नहीं है। हो सकता है कि स्मृति स्थान का उपयोग खाली हो। –

+0

@ गौरवसिंह मुझे लगता है कि CGDataProviderCopyData, CGImageGetDataProvider और CFDataGetBytePtr का उपयोग उचित है। क्या आपने अभी कोड स्विच किया है? यह आपकी मदद करेगा यदि आपने यह प्रश्न स्पष्ट करने के लिए अपना प्रश्न अपडेट किया है कि आपकी समस्या अभी भी क्या है। –

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