Загрузка уменьшенной версии изображения для производительности Android - PullRequest
0 голосов
/ 05 мая 2020

У меня есть изображение (1,84 МБ) для загрузки, и я хочу загрузить его меньшую версию, чтобы выиграть время, я также не хочу хранить его меньшую версию. Для информации, эти файлы находятся на съемной SD-карте, и мне нужно много загружать, поэтому я хочу оптимизировать их, так как на данный момент это занимает слишком много времени ...

Я красный загрузить большие растровые изображения документацию. Ранее я использовал Glide для загрузки полного изображения.

После некоторого теста я получаю эту статистику: Glide load (1,84 МБ): 244'361'667 нс Загрузка растрового изображения (масштаб 1): 370'811'511 нс Загрузка растрового изображения (масштаб 4): 324'403'386 нс Загрузка растрового изображения (масштаб 8): 269'223'073 нс Загрузка эскиза: 245'250'729 нс

Это означает, что у меня немного больше времени с растровым изображением при загрузке изображения в 8 раз меньшего размера, и я не понимаю, почему.

Вот мой код:

загрузка с скольжением:

private void loadGlide(Car c) {
DocumentFile makerDir = contentDirectory.findFile(getMakerById(c.getMakerId()).getName());
DocumentFile carPhoto = makerDir.findFile(c.getFilename());
if(carPhoto == null) {
    Log.d("test", c.getFilename() + " problem");
} else {
    Log.d("test", carPhoto.exists() + "");
}
ImageView img = new ImageView(this);
img.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        goToEdit(c.getId());
    }
});
// standard loading
Glide.with(img.getContext()).load(carPhoto.getUri()).into(img);
resultList.addView(img);

}

загрузка с растровым изображением:

private void scaledLoad(Car c, int scale) {
DocumentFile makerDir = contentDirectory.findFile(getMakerById(c.getMakerId()).getName());
DocumentFile carPhoto = makerDir.findFile(c.getFilename());
Bitmap b = null;
//Decode image size
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = scale;
// convert DocumentFile to File
File image = new File("image_path");
FileInputStream fis = null;
try {
    fis = new FileInputStream(image);
    b = BitmapFactory.decodeStream(fis, null, options);
    fis.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
if(b != null) {
    ImageView img = new ImageView(this);
    img.setImageBitmap(b);
    resultList.addView(img);
}

}

Я также пытался загрузить эскизы :

private void loadThumbnail() {
Bitmap ThumbImage = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile("filepath"),
        816, 612);
ImageView img = new ImageView(this);
img.setImageBitmap(ThumbImage);
resultList.addView(img);

}

И вот тестовый код, если хотите:

long t0 = System.nanoTime();
scaledLoad(c, 1);
// or
loadGlide(c);
long t1 = System.nanoTime();
t1 = (t1-t0);
Log.d("test", "t1:" + t1);

Если вы можете ответить мне или дать мне любую другую альтернативу для загрузки изображений с уменьшенным масштабом с SD-карты FAST, добро пожаловать. Заранее спасибо.

1 Ответ

0 голосов
/ 07 мая 2020

Если вы используете Glide, вы можете использовать функцию «override (width, height)» для загрузки изображения с измененным размером в imageView.

В этом блоге объясняется, как это сделать: https://futurestud.io/tutorials/glide-image-resizing-scaling#imageresizingwithoverridexy

...