2014-07-10 10 views
10

के साथ लोड किए गए इमेज व्यू से बिटमैप प्राप्त करें मेरे पास एक विधि है जो छवियों को लोड करती है, अगर छवि को सर्वर पर लोड करने से पहले लोड नहीं किया गया है। फिर यह इसे ऐप्स फ़ाइल सिस्टम में संग्रहीत करता है। यदि यह फ़ाइल सिस्टम में है तो यह उस छवि को लोड करता है क्योंकि यह सर्वर से छवियों को खींचने से बहुत तेज़ है। यदि आपने ऐप को बंद किए बिना पहले छवि लोड की है तो इसे एक स्थिर शब्दकोश में संग्रहीत किया जाएगा ताकि स्मृति त्रुटियों से बचने के लिए इसे और अधिक मेमोरी का उपयोग किए बिना पुनः लोड किया जा सके।पिकासो

यह सब ठीक काम किया जब तक कि मैंने पिकासो छवि लोडिंग लाइब्रेरी का उपयोग शुरू नहीं किया। अब मैं छवियों को एक छवि दृश्य में लोड कर रहा हूं लेकिन मुझे नहीं पता कि बिटमैप को वापस कैसे किया जाए ताकि मैं इसे फ़ाइल या स्थिर शब्दकोश में संग्रहीत कर सकूं। इसने चीजों को और अधिक कठिन बना दिया है। क्योंकि इसका मतलब है कि यह हर बार सर्वर से छवि लोड करने का प्रयास करता है, जो कुछ ऐसा नहीं करना चाहता है। क्या कोई तरीका है कि मैं इसे छविव्यू में लोड करने के बाद बिटमैप प्राप्त कर सकता हूं? नीचे मेरा कोड है:

public Drawable loadImageFromWebOperations(String url, 
     final String imagePath, ImageView theView, Picasso picasso) { 
    try { 
     if (Global.couponBitmaps.get(imagePath) != null) { 
      scaledHeight = Global.couponBitmaps.get(imagePath).getHeight(); 
      return new BitmapDrawable(getResources(), 
        Global.couponBitmaps.get(imagePath)); 
     } 
     File f = new File(getBaseContext().getFilesDir().getPath() 
       .toString() 
       + "/" + imagePath + ".png"); 

     if (f.exists()) { 
      picasso.load(f).into(theView); 
      **This line below was my attempt at retrieving the bitmap however 
      it threw a null pointer exception, I assume this is because it 
      takes a while for Picasso to add the image to the ImageView** 
      Bitmap bitmap = ((BitmapDrawable)theView.getDrawable()).getBitmap(); 
      Global.couponBitmaps.put(imagePath, bitmap); 
      return null; 
     } else { 
      picasso.load(url).into(theView); 
      return null; 
     } 
    } catch (OutOfMemoryError e) { 
     Log.d("Error", "Out of Memory Exception"); 
     e.printStackTrace(); 
     return getResources().getDrawable(R.drawable.default1); 
    } catch (NullPointerException e) { 
     Log.d("Error", "Null Pointer Exception"); 
     e.printStackTrace(); 
     return getResources().getDrawable(R.drawable.default1); 
    } 
} 

किसी भी मदद की सराहना की जाएगी, धन्यवाद!

+0

पिकासो हर बार सर्वर से छवियों को लोड नहीं करेगा। केवल पहली बार तो यह कैश निर्देशिका से लोड होता है। – intrepidkarthi

उत्तर

7

पिकासो आपको डाउनलोड की गई छवियों पर प्रत्यक्ष नियंत्रण देता है। फ़ाइल में डाउनलोड की गई छवियां को बचाने के लिए कुछ इस तरह करते हैं:

Picasso.with(this) 
    .load(currentUrl) 
    .into(saveFileTarget); 

कहाँ:

saveFileTarget = new Target() { 
    @Override 
    public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from){ 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       File file = new File(Environment.getExternalStorageDirectory().getPath() + "/" + FILEPATH); 
       try { 
        file.createNewFile(); 
        FileOutputStream ostream = new FileOutputStream(file); 
        bitmap.compress(CompressFormat.JPEG, 75, ostream); 
        ostream.close(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 
    } 
} 
+0

क्या यह एक ड्रायबल के साथ भी किया जा सकता है? (कि मैं टीपी को एडिटटेक्स्ट में जोड़ने की कोशिश कर रहा हूं) मुझे कोई त्रुटि नहीं मिल रही है लेकिन यह काम नहीं कर रहा है – Sauron

0

आप पिकासो का उपयोग कर रहे हैं, क्या आप इसे भी का पूरा लाभ लेने के लिए कर सकते हैं। इसमें एक शक्तिशाली कैशिंग तंत्र शामिल है।

अपने Picasso उदाहरण पर का उपयोग यह देखने के लिए करें कि किस तरह का कैशिंग होता है (छवियों को डिस्क, मेमोरी या नेटवर्क से लोड किया जाता है)। देखें: http://square.github.io/picasso/ (डिबग संकेतक)

पिकासो की डिफ़ॉल्ट उदाहरण के साथ (http://square.github.io/picasso/javadoc/com/squareup/picasso/Picasso.html#with-android.content.Context-)

15% उपलब्ध आवेदन रैम

2 की डिस्क कैश% भंडारण ऊपर अंतरिक्ष के

LRU मेमोरी कैश कॉन्फ़िगर किया गया है 50 एमबी तक लेकिन 5 एमबी से कम नहीं। (नोट: इस एपीआई 14+ पर ही उपलब्ध है या यदि आप एक स्टैंडअलोन पुस्तकालय कि OkHttp की तरह सभी API स्तरों पर एक डिस्क कैश प्रदान करता है का उपयोग कर रहे)

आप भी अपने उदाहरण अनुकूलित करने के लिए Picasso.Builder का उपयोग कर अपने Cache उदाहरण निर्दिष्ट कर सकते हैं , और आप बेहतर नियंत्रण के लिए अपने Downloader निर्दिष्ट कर सकते हैं। (वहाँ पिकासो में OkDownloader के एक कार्यान्वयन जो स्वचालित रूप से प्रयोग किया जाता है, तो आप अपने एप्लिकेशन में OkHttp शामिल है।)

34

पिकासो के साथ आप, क्योंकि यह आपके लिए अपने आप से किया जाता है अपने स्वयं के स्थिर शब्दकोश को लागू करने की जरूरत नहीं है। @intrepidkarthi इस अर्थ में सही था कि पहली बार पिकासो द्वारा छवियों को स्वचालित रूप से कैश किया जाता है और इसलिए यह लगातार उसी छवि को प्राप्त करने के लिए सर्वर को कॉल नहीं करता है।

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

Picasso.with(this) 
     .load(url) 
     .into(new Target() { 
      @Override 
      public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from) { 
       /* Save the bitmap or do something with it here */ 

       //Set it in the ImageView 
       theView.setImageBitmap(bitmap); 
      } 

      @Override 
      public void onPrepareLoad(Drawable placeHolderDrawable) {} 

      @Override 
      public void onBitmapFailed(Drawable errorDrawable) {} 
    }); 

यह आपको लोड बिटमैप के लिए पहुँच, जबकि अभी भी यह अतुल्यकालिक रूप से लोड हो रहा है देता है: कि के लिए, मैं @Gilad Haimov का जवाब थोड़ा बदलाव किया।आपको इसे ImageView में सेट करना याद रखना होगा क्योंकि यह अब आपके लिए स्वचालित रूप से नहीं किया गया है।

एक तरफ ध्यान दें, यदि आप यह जानकर रुचि रखते हैं कि आपकी छवि कहां से आ रही है, तो आप उसी जानकारी के भीतर उस जानकारी तक पहुंच सकते हैं। उपर्युक्त विधि का दूसरा तर्क, Picasso.LoadedFrom from, एक enum है जो आपको बताता है कि बिटमैप किस स्रोत से लोड किया गया था (तीन स्रोत DISK, MEMORY, और NETWORK। (Source)। स्क्वायर इंक भी एक दृश्य तरीका प्रदान करता है देखकर डिबग संकेतक का उपयोग करके जहां बिटमैप से लोड किया गया था here समझाया।

आशा इस मदद करता है!

-1

उपयोग इस

Picasso.with(context) 
.load(url) 
.into(imageView new Callback() { 
    @Override 
    public void onSuccess() { 
     //use your bitmap or something 
    } 

    @Override 
    public void onError() { 

    } 
}); 

आशा है कि यह आप

मदद
+2

'ऑनसुसेप() 'बिटमैप ऑब्जेक्ट प्रदान नहीं करता है। – Hemanth

+0

हेमंत बस लक्ष्य को परिवर्तित या उपयोग करें। लक्ष्य बिटमैप प्रदान करते हैं! – Madi

0

इस उदाहरण में मैं एक कोलापिंग टूलबार की पृष्ठभूमि सेट करता था।

public class MainActivity extends AppCompatActivity { 

CollapsingToolbarLayout colapsingToolbar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

    colapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.colapsingToolbar); 
    ImageView imageView = new ImageView(this); 
    String url ="www.yourimageurl.com" 


    Picasso.with(this) 
     .load(url) 
     .resize(80, 80) 
     .centerCrop() 
     .into(image); 

    colapsingToolbar.setBackground(imageView.getDrawable()); 

} 

मुझे आशा है कि इससे आपकी मदद की जाएगी।

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