Как обрабатывать изображения высокого разрешения? - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть страница профиля, и у меня также есть изображение профиля, которое нужно загрузить с сервера, а затем поместить в режим просмотра изображений.Каждый раз, когда я открываю страницу профиля, этот процесс повторяется.Когда изображение ниже 500 кб или около того, все в порядке, но когда я помещаю на него изображение 6 Мб, страница работает не совсем гладко.Я имею в виду, что при прокрутке или выполнении чего-либо все занимает время.Это похоже на игру с высокой графикой на слабом компьютере.После прохождения этого процесса я попытался сжать изображение и смог уменьшить размер этой библиотеки до 2 МБ https://github.com/zetbaitsu/Compressor. Не меньше.Почему возникает эта проблема.

Я выполняю этот процесс загрузки для асинхронной задачи.

Способ загрузки

public void upload() {
    if (filePath != null) {
        Bitmap compressedImage = null;
        try {
            compressedImage = new Compressor(context).compressToBitmap(new File(filePath.getPath()));
        } catch (IOException e) {
            e.printStackTrace();
            try {
                compressedImage = MediaStore.Images.Media.getBitmap(context.getContentResolver(), filePath);
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }

        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        compressedImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        final String path = MediaStore.Images.Media.insertImage(context.getContentResolver(), compressedImage, "Title", null);

        StorageReference sRef = storageReference.child("images/" + name);
        sRef.putFile(Uri.parse(path))
                .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        if (ımageView != null)
                            ımageView.setImageURI(Uri.parse(filePath.getPath()));
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {
                        Log.i("resultUpload", exception.getLocalizedMessage());
                    }
                })
                .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {

                    }
                });
    } else {

    }
}

Мой метод загрузки изображений

public void download(final ImageView ımageView) {
    StorageReference sRef = storageReference.child("images/" + name);
    sRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
        @Override
        public void onSuccess(Uri uri) {
            Picasso.get().load(uri).into(ımageView, new Callback() {
                @Override
                public void onSuccess() {

                }

                @Override
                public void onError(Exception e) {

                }
            });
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Log.i("resultDownload", e.getLocalizedMessage());
        }
    });
}

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Это не проблема Java.Независимо от языка или платформы вам нужно сделать определенные вещи, чтобы правильно отобразить изображение в Интернете.Итак, вместо того, чтобы рекомендовать какую-либо библиотеку Java (я уверен, что вы получите много библиотек с открытым исходным кодом на каждом языке), я собираюсь перечислить основные шаги, которые необходимо выполнить:

  1. Вынеобходимо изменить размер (не обрезать) изображение для нескольких устройств.Не приличный сайт скачивает 6МБ изображения.Никогда!Даже 2MB изображения.Изображение моего профиля в Facebook, которое я сделал на своей 8-мегапиксельной мобильной камере, после загрузки имеет размер 160 КБ.Попробуйте уменьшить размер изображения примерно до 100 - 150 КБ.Это обычные размеры изображений.

enter image description here

Вы создали бы измененное изображение для мобильного телефона, планшета и ноутбука.Для мобильных устройств это обычно 640 x 480. Для планшетов это обычно 800 x 600. Для ноутбуков это обычно 1024 x 768

Затем сожмите изображение, как вы это сделали.Убедитесь, что конечное изображение является прогрессивным JPEG / JPG.Прогрессивный JPEG сжат в слоях.Браузеры, поддерживающие прогрессивные изображения, отображают туманный предварительный просмотр при загрузке изображения.Это улучшает пользовательский опыт.Для браузеров, которые не поддерживают прогрессивное изображение, используются некоторые обходные пути.Например, вы можете создать низкокачественную версию вашего изображения (размером около 1 КБ) с помощью opacity: 1; filter: blur(20px);.Таким образом, размытая версия изображения будет отображаться при загрузке изображения более высокого качества.Первоначально вы устанавливаете непрозрачность изображения более высокого качества на 0. Как только загрузка изображения более высокого качества будет завершена, вы устанавливаете непрозрачность изображения более низкого качества на 0, а изображения более высокого качества - на 1. Вы можете проверить, является ли ваше изображениепрогрессивный или нет здесь и может создавать сжатое прогрессивное изображение здесь .Возможно, вы сделаете все это программно, но эти ресурсы могут служить справочными.

Убедитесь, что ваш сервер поддерживает HTTP / 2, который полностью мультиплексирован.Вы можете увидеть мультиплексирование здесь.Таким образом, ресурсы могут загружаться параллельно.

enter image description here

Убедитесь, что ваш сервер поддерживает gzip или сжатие.Таким образом, ресурсы передаются по сети в формате GZIP и автоматически извлекаются браузером.Это обеспечивает быструю загрузку.

Используйте правильные cache-control заголовки, чтобы браузер кэшировал изображения, избавляя от необходимости загружать изображение при каждом посещении.

Если возможно, следует использовать мобильную конструкцию, чтобы производительность стала лучше.

0 голосов
/ 28 ноября 2018

Что вы можете сделать, как сказал Милан, это получить изображение с URL-адреса в Интернете, а затем установить для этого изображения значение imageView.Во-первых, вам нужно убедиться, что у вас есть интернет-разрешение:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

Затем вы можете сделать следующее, чтобы установить изображение в imageView:

Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL("Your image URL comes here".getContent());
imageView.setImageBitmap(bitmap); 

Этодолжно работать, получая растровое изображение, расположенное по указанному вами URL.Затем он установит imageView для этого растрового изображения.


ИЛИ , вы можете использовать Пикассо.Добавьте это к вашему app/build.gradle:

implementation 'com.squareup.picasso:picasso:2.5.2'

Затем используйте этот Java-код для установки изображения в imageView:

String imageUri = "Your image URL";
Picasso.with(getApplicationContext()).load(imageUri).into(imageView);

. Это использует Пикассо для получения изображения изURL в imageView.Я надеялся, что это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...