2011-06-21 16 views
10

मुझे पता है कि एंड्रॉइड प्लेटफार्म जटिल और अधिक इंजीनियर पर एक बड़ी गड़बड़ है, लेकिन बिटमैप के आकार को गंभीरता से प्राप्त करने के लिए, क्या यह वास्तव में उन सभी रूपांतरणों को करना आवश्यक है?जहां बिल्ली बिटमैप getByteCount() है?

Bitmap bitmap = your bitmap object 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
    byte[] imageInByte = stream.toByteArray(); 
long length = imageInByte.length; 

गूगल प्रलेखन बिटमैप के अनुसार एक विधि getByteCount() यह करने के लिए है, लेकिन यह SDK2.2 में मौजूद नहीं है, अन्य के प्रयास नहीं किया है, लेकिन यह की बहिष्कृत किया जा रहा कोई जिक्र नहीं है या कि API समर्थन किसी भी है एपीआई 1 से अलग ... तो यह रहस्यमय तरीका कहाँ छिप रहा है? आप एपीआई स्तर 8 (= एसडीके 2.2) के आधार पर फ़िल्टर अगर यह सरल करते

bitmap.getByteCount() 

उत्तर

12

को albe होने के लिए वास्तव में अच्छा होता है, तो आप देखेंगे कि Bitmap#getByteCount() धूसर हो जाता है, जिसका अर्थ है कि विधि है कि एपीआई स्तर में मौजूद नहीं है ।

getByteCount() एपीआई स्तर 12.

+0

एसडीके अब आपके द्वारा उपयोग किए जा रहे एपीआई का पता लगाने में आपकी सहायता करता है जो आपकी परियोजनाओं में पुराने (लक्षित) संस्करण पर मौजूद नहीं है। –

61

मैं सिर्फ इस विधि लिखा में जोड़ा गया है। AndroidVersion.java एक वर्ग है जिसे मैंने आसानी से फोन से संस्करण कोड प्राप्त करने के लिए बनाया है।

http://code.google.com/p/android-beryl/source/browse/beryl/src/org/beryl/app/AndroidVersion.java

public static long getSizeInBytes(Bitmap bitmap) { 
    if(AndroidVersion.isHoneycombMr2OrHigher()) { 
     return bitmap.getByteCount(); 
    } else { 
     return bitmap.getRowBytes() * bitmap.getHeight(); 
    } 
} 
+18

getByteCount() केवल एक सुविधा विधि है जो ठीक है जो आपने अन्य-ब्लॉक में रखी है। दूसरे शब्दों में, यदि आप हमेशा "bitmap.getRowBytes() * bitmap.getHeight()" को वापस करने के लिए getSizeInBytes को फिर से लिखते हैं, तो आपको एंड्रॉइड संस्करण की आवश्यकता नहीं है। –

+1

आपको वापस लौटना चाहिए (bitmap.getRowBytes() * bitmap.getHeight())/1024; ' –

1

एपीआई 12 इससे पहले कि आप एक बिटमैप का उपयोग कर के बाइट आकार की गणना कर सकते getHeight() * getWidth() * 4 अगर आप ARGB_8888 उपयोग कर रहे हैं, क्योंकि हर पिक्सेल 4bytes में संग्रहित है। मुझे लगता है कि यह डिफ़ॉल्ट प्रारूप है।

1

जैसा कि अन्य उत्तरों में बताया गया है, यह केवल एपीआई 12 या उच्चतर पर उपलब्ध है। यह विधि का एक सरल संगतता संस्करण है।

public static int getByteCount(Bitmap bitmap) { 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1) { 
     return bitmap.getRowBytes() * bitmap.getHeight(); 
    } else { 
     return bitmap.getByteCount(); 
    } 
} 
0

मैंने उपरोक्त सभी विधियों का प्रयास किया और वे करीब थे, लेकिन बिल्कुल सही नहीं (मेरी स्थिति कम से कम)।

मैं bitmap.getByteCount() का उपयोग कर रहा था; विधि sizeof() के अंदर एक नया LruCache बनाते समय:

mMemoryCache = new LruCache<String, Bitmap>(cacheSize) { 
    @Override 
    protected int sizeOf(String key, Bitmap bitmap) { 
     return bitmap.getByteCount(); 
    } 
}; 

मैं तो सुझाव दिया की कोशिश की:

return bitmap.getRowBytes() * bitmap.getHeight(); 

यह महान था, लेकिन मैंने देखा है कि लौटे मूल्यों अलग थे और जब मैं इस्तेमाल किया उपर्युक्त सुझाव, यह मेरे डिवाइस पर भी कैश नहीं करेगा। मैं एक नेक्सस वन चल एपीआई 3.2 पर वापसी मूल्यों का परीक्षण किया और एक आकाशगंगा नेक्सस चल 4.2:

return (bitmap.getRowBytes() * bitmap.getHeight())/1000; 

के बजाय:

bitmap.getByteCount(); returned-> 15 
bitmap.getRowBytes() * bitmap.getHeight(); returned-> 15400 

तो मेरी इस मुद्दे को हल करने के लिए, मैं बस ऐसा किया

return bitmap.getByteCount(); 

उसी स्थिति में नहीं हो सकता है, लेकिन यह मेरे लिए काम करता था।

+0

हर जगह मैं देखता हूं, हर स्रोत जिसे मैं पढ़ता हूं, मैं इसे देखता हूं 'वापसी (bitmap.getRowBytes() * bitmap.getHeight())/1000; '। यह फ़ाइल का प्रकार होना चाहिए जो मैं सहेज रहा हूं या कुछ। तो अगली बार मुझे 'bitmap.getByteCount();' का उपयोग करने की आवश्यकता है; ', मैं यह देखने के लिए कुछ परीक्षण करूंगा कि मुझे पहले किस मूल्य की आवश्यकता है। – levibostian

+0

आपको '(bitmap.getRowBytes() * bitmap.getHeight())/1024;' बदले में वापस जाना चाहिए। –

0

आप स्रोत कोड में देख सकते हैं, getByteCount बस यह है:

public final int getByteCount() { 
    // int result permits bitmaps up to 46,340 x 46,340 
    return getRowBytes() * getHeight(); 
} 

Here is the source code for 5.0

3

यहाँ जवाब थोड़ा पुराने हो गए हैं। कारण (docs में):

getByteCount: किटकैट के रूप में, इस विधि का परिणाम अब कोई एक बिटमैप की स्मृति के उपयोग का निर्धारण किया जा सकता है। getAllocationByteCount() देखें।

तो, वर्तमान जवाब होना चाहिए:

पूर्णांक परिणाम = BitmapCompat.getAllocationByteCount (बिटमैप)

या, यदि आप इसे अपने आप को लेखन पर जोर देते हैं:

public static int getBitmapByteCount(Bitmap bitmap) { 
    if (VERSION.SDK_INT < VERSION_CODES.HONEYCOMB_MR1) 
     return bitmap.getRowBytes() * bitmap.getHeight(); 
    if (VERSION.SDK_INT < VERSION_CODES.KITKAT) 
     return bitmap.getByteCount(); 
    return bitmap.getAllocationByteCount(); 
} 
संबंधित मुद्दे