2011-06-18 11 views
5

मैं एक यूआरएल से imags डाउनलोड करने की कोशिश कर रहा हूं और फिर उन्हें डीकोड कर रहा हूं। समस्या यह है कि मुझे नहीं पता कि वे कितने बड़े हैं और यदि मैं उन्हें तुरंत डीकोड करता हूं, तो ऐप बहुत बड़ी छवियों के साथ दुर्घटनाग्रस्त हो जाता है।मुझे java.io.IOException क्यों मिल रहा है: मार्क को अवैध कर दिया गया है?

मैं निम्नलिखित कर रहा हूं और यह अधिकांश छवियों के साथ काम करता है लेकिन उनमें से कुछ के साथ, यह java.io.IOException: Mark has been invalidated अपवाद फेंकता है। यह आकार का मामला नहीं है क्योंकि यह 75 केबी या 120 केबी छवि के साथ होता है और 20 एमबी या 45 केबी छवि के साथ नहीं होता है। प्रारूप भी महत्वपूर्ण नहीं है क्योंकि यह या तो jpg या png छवि के साथ हो सकता है।

pis एक InputStream है।

Options opts = new BitmapFactory.Options(); 
    BufferedInputStream bis = new BufferedInputStream(pis); 
    bis.mark(1024 * 1024); 
    opts.inJustDecodeBounds = true; 
    Bitmap bmImg=BitmapFactory.decodeStream(bis,null,opts); 

    Log.e("optwidth",opts.outWidth+""); 
    try { 
     bis.reset(); 
     opts.inJustDecodeBounds = false; 
     int ratio = opts.outWidth/800; 
     Log.e("ratio",String.valueOf(ratio)); 
     if (opts.outWidth>=800)opts.inSampleSize = ratio; 

     return BitmapFactory.decodeStream(bis,null,opts); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     return null; 
    } 

उत्तर

6

मुझे लगता है कि आप बड़ी छवि को डीकोड करना चाहते हैं। मैंने गैलरी छवि का चयन करके किया।

File photos= new File("imageFilePath that you select"); 
Bitmap b = decodeFile(photos); 

"डीकोडफाइल (फोटो)" फ़ंक्शन का उपयोग बड़ी छवि को डीकोड करने के लिए किया जाता है। मुझे लगता है कि आपको छवि .png या .jpg फॉर्मेट प्राप्त करने की आवश्यकता है।

private Bitmap decodeFile(File f){ 
     try { 
      //decode image size 
      BitmapFactory.Options o = new BitmapFactory.Options(); 
      o.inJustDecodeBounds = true; 
      BitmapFactory.decodeStream(new FileInputStream(f),null,o); 

      //Find the correct scale value. It should be the power of 2. 
      final int REQUIRED_SIZE=70; 
      int width_tmp=o.outWidth, height_tmp=o.outHeight; 
      int scale=1; 
      while(true){ 
       if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE) 
        break; 
       width_tmp/=2; 
       height_tmp/=2; 
       scale++; 
      } 

      //decode with inSampleSize 
      BitmapFactory.Options o2 = new BitmapFactory.Options(); 
      o2.inSampleSize=scale; 
      return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); 
     } catch (FileNotFoundException e) {} 
     return null; 
    } 

आप छवि दृश्य का उपयोग करके इसे प्रदर्शित कर सकते हैं।

ImageView img = (ImageView)findViewById(R.id.sdcardimage); 
img.setImageBitmap(b); 
+0

लेकिन यह कैसे मैं InputStream कि जानकारी शामिल है एक बिटमैप में परिवर्तित करने पारित कर सकते हैं? ¿ – sergi

+0

@sergi इस यह करने के लिए सबसे अच्छा तरीका है। आपके पास इनपुट इनपुट है और 'डीकोडस्ट्रीम()' इनपुट स्ट्रीम पैरामीटर लेता है। – Haphazard

+0

अब मुझे यह काम मिल गया है लेकिन यह देखना चाहता था कि यह करने का सबसे अच्छा तरीका कौन सा था .. – sergi

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