2013-12-16 5 views
5

के साथ बिल्कुल समान नहीं है। मैं इस पृष्ठ पर Android GPUImage का उपयोग करने की कोशिश कर रहा हूं https://github.com/CyberAgent/android-gpuimage वीडियो पर कुछ वास्तविक समय फ़िल्टरिंग कार्य करने के लिए, और मैं glReadPixels का उपयोग करता हूं() जीपीयू द्वारा संसाधित किए गए डेटा को प्राप्त करने के लिए और फ़िल्टर जोड़ा गया है, फिर मैंने डेटा वापस लौटाकर बिटमैप बनाया और इसे अंत में एक जेपीईजी तस्वीर में संपीड़ित किया। प्रक्रिया ठीक काम करती है लेकिन जेपीईजी पूर्वावलोकन के समान नहीं है, यह पूर्वावलोकन के निचले भाग को प्रदर्शित करता है, हालांकि इसका आकार सही है, मैं इसे लंबे समय से खोज रहा हूं लेकिन अभी भी कोई सुराग नहीं है, तो क्या आप लोग मुझे कुछ सलाह दे सकते हैं, किसी भी सुझाव की सराहना की जाएगी।एंड्रॉइड पर GLES20.glReadPixels का उपयोग करते समय, इसके द्वारा लौटा गया डेटा जीवित पूर्वावलोकन

और मेरे कोड है कि glReadPixels का उपयोग कर इस तरह है:

public static Bitmap SavePixels(int x, int y, int w, int h){ 
    int b[]=new int[w*(y+h)]; 
    int bt[]=new int[w*h]; 
    IntBuffer ib = IntBuffer.wrap(b); 
    ib.position(0); 
    GLES20.glReadPixels(0, 0, w, h, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, ib); 

     for(int i=0, k=0; i<h; i++, k++) 
     {//remember, that OpenGL bitmap is incompatible with Android bitmap 
     //and so, some correction need.   
      for(int j=0; j<w; j++) 
      { 
        int pix=b[i*w+j]; 
        int pb=(pix>>16)&0xff; 
        int pr=(pix<<16)&0x00ff0000; 
        int pix1=(pix&0xff00ff00) | pr | pb; 
        bt[(h-k-1)*w+j]=pix1; 
      } 
     } 

     Bitmap sb=Bitmap.createBitmap(bt, w, h, Bitmap.Config.ARGB_8888); 
     return sb; 
} 

मैं इस समारोह के तुरंत बाद GLES20.glDrawArrays (GLES20.GL_TRIANGLE_STRIP, 0, 4) जो OnDraw समारोह में है कहा जाता है।

+0

आप जीएलएसएल के साथ एक शेडर का उपयोग क्यों नहीं करते हैं, इस तरह आप ओपनजीएल के साथ फ़िल्टरिंग करने का अनुमान लगाते हैं। – Vallentin

+0

हाय वल्लेन्टिन, आपकी टिप्पणी के लिए थक्स, लेकिन मैं ओपेनजीएल से बहुत परिचित नहीं हूं, इसलिए मुझे इस ओपन कोर प्रोजेक्ट का उपयोग करना है, मेरा मतलब डेटा प्राप्त करने के लिए है और फिर उन्हें .264 फ़ाइल में एन्कोड करना है। – geekShaw

+0

मैं समझता हूं कि आपका नया, लेकिन ऐसा करना एक बड़ा अपशिष्ट जैसा लगता है। शेडर ओपनजीएल का हिस्सा हैं और वे सीखने, उपयोग करने और लागू करने के लिए बहुत ही सरल हैं। तो मैं सुझाव दूंगा कि आप उन्हें देखें, और इसके बजाय उनका उपयोग करें। – Vallentin

उत्तर

3

यह समस्या हल हो गई है, ऐसा इसलिए हुआ क्योंकि glReadPixels बफर को पढ़ता है जो सतह से जुड़ा हुआ है पूर्वावलोकन देखें कि पूर्वावलोकन प्रदर्शित होता है, और इस सतह का आकार दृश्य चौड़ाई और ऊंचाई पैराम से बड़ा है जो मैंने glReadPixels में सेट किया है, इसलिए यह पूर्वावलोकन का हिस्सा दिखाया गया है (पूर्वावलोकन के बाएं कोने से शुरू होता है)।

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