2017-08-03 1 views
3
ArrayList<String> imageFileList = new ArrayList<>(); 
ArrayList<RecentImagesModel> fileInfo = new ArrayList<>(); 

File targetDirector = new File(/storage/emulated/0/DCIM/Camera/); 
if (targetDirector.listFiles() != null) { 
    File[] files = targetDirector.listFiles(); 
    int i = files.length - 1; 
    while (imageFileList.size() < 10) { 
     File file = files[i]; 
     if (file.getAbsoluteFile().toString().trim().endsWith(".jpg")) { 
      imageFileList.add(file.getAbsolutePath()); 
     } else if (file.getAbsoluteFile().toString().trim().endsWith(".png")) { 
      imageFileList.add(file.getAbsolutePath()); 
     } 
     i--; 
    } 
} 

String file, filename; 
Bitmap rawBmp, proBmp; 
int length = imageFileList.size(); 

for (int i = 0; i < length; i++) { 
    RecentImagesModel rim = new RecentImagesModel(); 
    file = imageFileList.get(i); 
    rim.setFilepath(file); 
    filename = file.substring(file.lastIndexOf("/") + 1); 
    rim.setName(filename); 
    rawBmp = BitmapFactory.decodeFile(file); 
    proBmp = Bitmap.createScaledBitmap(rawBmp, rawBmp.getWidth()/6, rawBmp.getHeight()/6, false); 
    rim.setBitmap(proBmp); 
    fileInfo.add(rim); 
} 

Wenn ich die Datei Objekte in Bitmaps bin Umwandlung und neu zu skalieren sie:Wie konvertiert man die Liste der Bilddateipfade schnell in die Liste der Bitmaps?

rawBmp = BitmapFactory.decodeFile(file); 
proBmp = Bitmap.createScaledBitmap(rawBmp, rawBmp.getWidth()/6, rawBmp.getHeight()/6, false); 

Es dauert in der Verarbeitung viel Zeit. Gibt es eine Möglichkeit, den Prozess zu verkürzen?

Antwort

0

Gibt es eine Möglichkeit, den Prozess zu verkürzen?

Mit Ihrem aktuellen Algorithmus, haben Sie eine kleinere Liste von Bildern.

könnten Sie sparen sich viel Zeit und viel Speicher durch:

  • Wechsel von „1/6 des Originalbildes“ entweder auf „1/4 des ursprünglichen Bildes“ oder " 1/8-tel des ursprünglichen Bildes“, dann

  • Verwendung des zwei-Parameter decodeFile(), die ein BitmapFactory.Options nimmt, und liefert einen inSampleSize von 2 (1/4) oder 3 (für 1/8-tel)

Im Allgemeinen ist es keine gute Idee, eine ganze Reihe von Bildern gleichzeitig zu laden. Daher empfehle ich Ihnen dringend, eine Möglichkeit zu finden, Bilder genau dann und nur dann zu laden, wenn sie benötigt werden. Wenn der Benutzer beispielsweise Hunderte von Fotos mit hoher Auflösung in diesem Verzeichnis hat, stürzen Sie mit einem OutOfMemoryError ab, da Sie nicht genügend Heap-Speicher für Hunderte von Bildern haben.

+0

Ich muss mindestens 10 Bilder zur Verfügung stellen, kann nicht kleiner als diese gehen. –

+0

versuchte 1/8 des ursprünglichen Bildes, es bindet Bilder in recylerview quicky. Aber das Konvertieren von Dateiobjekten in Bitmaps und das Speichern in Arraylist dauert immer noch. –

+0

@ShubhanshJaiswal: Wenn Sie eine 'RecyclerView' verwenden, laden Sie Bilder * mit * einer Bildlade-Bibliothek (Glide, Picasso usw.) nach Bedarf *, anstatt sie im Vordergrund zu laden. – CommonsWare

Verwandte Themen