2012-04-01 20 views
5

जब मैं copyPixelsFromBuffer और copyPixelsToBuffer उपयोग कर रहा हूँ, बिटमैप ही एक के रूप में दिखाई नहीं दे रहा का उपयोग करना, मैं नीचे दिए गए कोड की कोशिश की है:नए बिटमैप कॉपी पर बदली गई बफर

Bitmap bm = BitmapFactory.decodeByteArray(a, 0, a.length); 
int[] pixels = new int[bm.getWidth() * bm.getHeight()]; 
bm.getPixels(pixels, 0, bm.getWidth(), 0, 0,bm.getWidth(),bm.getHeight()); 

ByteBuffer buffer = ByteBuffer.allocate(bm.getRowBytes()*bm.getHeight()); 
bm.copyPixelsToBuffer(buffer);//I copy the pixels from Bitmap bm to the buffer 

ByteBuffer buffer1 = ByteBuffer.wrap(buffer.array()); 
newbm = Bitmap.createBitmap(160, 160,Config.RGB_565); 
newbm.copyPixelsFromBuffer(buffer1);//I read pixels from the Buffer and put the pixels  to the Bitmap newbm. 

imageview1.setImageBitmap(newbm); 
imageview2.setImageBitmap(bm); 

क्यों बिटमैप बी.एम. और newbm प्रदर्शित नहीं किया वही सामग्री?

उत्तर

0

अपने कोड में, आप पिक्सेल को RGB_565 प्रारूप के साथ बिटमैप में कॉपी कर रहे हैं, जबकि मूल बिटमैप जिसमें से आपको पिक्सल मिलते हैं, एक अलग प्रारूप में होना चाहिए।

डेटा बफर में setPixels() के विपरीत (किसी भी तरह से में नहीं बदला गया है, जो unpremultipled 32 बिट से जो कुछ भी बिटमैप के देशी प्रारूप में धर्मान्तरित:

समस्या copyPixelsFromBuffer() की documentation से स्पष्ट है है।

तो या तो एक ही बिटमैप स्वरूप का उपयोग, या का उपयोग कर setPixels() का उपयोग करें या नया एक पर मूल बिटमैप आकर्षित एक Canvas.drawBitmap() कॉल।

इसके अलावा bm.getWidth() & bm.getHeight() का उपयोग 160 के रूप में हार्ड-कोड नए बिटमैप का आकार निर्दिष्ट करने के बजाय करने के लिए।

+0

बिटमैपफ़ैक्टरी.ऑप्शन ऑप्ट्स = नए विकल्प(); opts.inPreferredConfig = Config.RGB_565; \t \t \t \t \t बीएम = बिटमैपफैक्टरी.decodeByteArray (ए, 0, a.length, opts); मूल बिटमैप की कॉन्फ़िगरेशन RGB565 है, यहां तक ​​कि मैं कॉन्फ़िगरेशन सेट नहीं करता हूं, कॉन्फ़िगरेशन RGB565 के रूप में डिफ़ॉल्ट है ... – Hexor

+0

@Hexor मेरे उत्तर कार्य में वर्णित अन्य विधियां करें? 'बीएम' की तुलना में 'newbm' देखो कितना अलग है? –

+0

आकार सही नहीं है, और गुणवत्ता बहुत कम है। मुझे स्वयं एक समाधान मिला जो इस तरह है, मूल बीएम नामक बिटमैप बनाएं, और मूल बीएम शुरू करने के लिए बिटमैप फैक्ट्री की डिकोड विधि कहा जाता है (केवल यह सुनिश्चित करें कि पैरामीटर मूल बीएम सही शुरू कर सकता है), तो मैं newbm = originBm का उपयोग करता हूं; newbm.copyPixelsFromBuffer (buffer1)। इसके बाद, newbm सही चीज़ प्रदर्शित कर सकता है। मुझे नहीं पता कि इसका कारण किस कारण से है, लेकिन मैंने सोचा कि शायद copyPixelsFromBuffer() का उपयोग करते समय, हम कुछ ऐसा याद करते हैं जो createBitmap() विधि हमें नहीं दे सका। – Hexor