如何处理高分辨率图像?

时间:2018-11-28 13:47:32

标签: java android android-asynctask

我有一个配置文件页面,我也有要从服务器下载的配置文件图像,然后将其置于图像视图中。每次我打开配置文件页面时,此过程都会重复一次。当图像低于500 kb左右时,一切正常,但是当我在其上放置6mb图像时,页面无法正常工作。我的意思是滚动或执行任何操作时都需要时间。就像在弱小的计算机上运行高级图形游戏一样。经过此过程后,我尝试压缩图像,并通过此库https://github.com/zetbaitsu/Compressor将大小减小到2 MB。没什么。为什么会出现此问题。

我正在异步任务上执行此上传过程。

上传方法

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 :(得分:1)

正如米兰所说,您可以做的是在线获取图像,然后将该图像设置为您的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设置为该位图。


OR ,您可以使用毕加索。将此添加到您的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);

这使用Picasso将图像从URL获取到imageView中。 我希望这会有所帮助。

答案 1 :(得分:1)

这不是Java问题。无论使用哪种语言或平台,都需要执行某些操作才能在网络上正确显示图像。因此,与其推荐任何Java库(我相信您会在每种语言中获得许多开源库),不如列举您需要遵循的基本步骤:

  1. 您需要调整多个设备的图像大小(而不是裁剪)。没有像样的网站下载6MB图像。决不!甚至没有2MB的图像。上传后,我在8MP移动相机上捕获的Facebook个人资料图像大小为160 KB。尝试将图像大小减小到100-150 KB左右。这些是一些常用的图片尺寸。

enter image description here

  1. 您将为手机,平板电脑和笔记本电脑创建调整大小的图像。对于移动设备,通常为640 x480。对于平板电脑,通常为800 x600。对于笔记本电脑,通常为1024 x 768

  2. 然后像您一样压缩图像。确保最终图像是渐进式jpeg / jpg。渐进式jpeg分层压缩。下载图像时,支持渐进式图像的浏览器会显示朦胧的预览。这样可以改善用户体验。对于不支持渐进式图像的浏览器,使用了一些解决方法。例如您可以使用opacity: 1; filter: blur(20px);创建图像的低质量版本(大小约为1KB)。因此,当下载更高质量的图像时,将显示图像的模糊版本。最初,您将较高质量图像的不透明度设置为0。一旦完成较高质量图像的下载,则将较低质量图像的不透明度设置为0,将较高质量图像的不透明度设置为1。您可以测试图像是否为渐进式here或不渐进式here,并且可以创建压缩的渐进式图像enter image description here。您可能会以编程方式进行这些操作,但是这些资源可以作为参考。

  3. 确保您的服务器支持完全复用的HTTP / 2。您可以在此处看到多路复用。这样就可以并行下载资源。

Getting active window information in Java

  1. 确保服务器支持gzip或压缩。因此,资源以压缩格式通过网络传输,并由浏览器自动提取。这样可以确保快速下载。

  2. 使用适当的cache-control标头,以便浏览器缓存图像,而无需每次访问都下载图像。

  3. 如果可能的话,应使用移动优先设计,以便移动性能更好。