Java 如何将URL字符串末尾的低分辨率图像引用替换为可用的高分辨率图像引用

Java 如何将URL字符串末尾的低分辨率图像引用替换为可用的高分辨率图像引用,java,android,split,android-image,Java,Android,Split,Android Image,从API中,我从URL字符串中获得一个缩略图,类似于以下格式: . 然而,对于android应用程序的开发来说,这看起来非常糟糕 API中没有可用的高分辨率图像。然而,我发现,通过改变URL的结尾,图像以1000px甚至2000px的速度存在 我想将URL字符串更改为更高分辨率的版本,该版本存在于具有改进后缀的同一位置: 额外要求: API很少给出500以外的不同大小,比如1000或250 在极少数情况下,它以.png而不是.jpg结尾(甚至可能是其他格式) 在极少数情况下,图像在较高分辨率

从API中,我从URL字符串中获得一个缩略图,类似于以下格式: . 然而,对于android应用程序的开发来说,这看起来非常糟糕

API中没有可用的高分辨率图像。然而,我发现,通过改变URL的结尾,图像以1000px甚至2000px的速度存在

我想将URL字符串更改为更高分辨率的版本,该版本存在于具有改进后缀的同一位置:

额外要求:

  • API很少给出500以外的不同大小,比如1000或250
  • 在极少数情况下,它以.png而不是.jpg结尾(甚至可能是其他格式)
  • 在极少数情况下,图像在较高分辨率下不存在,应单独保存
因此,解决方案需要比我目前的编码能力更加健壮

这是我在androidstudio中的代码块,它工作得很好,但没有满足额外的要求。我只在Java和Android Studio中编写了几个月的代码,因此可能存在一些问题:

 /**
 * Load an image from a URL and return a {@link Bitmap}
 *
 * @param url string of the URL link to the image
 * @return Bitmap of the image
 */
private static Bitmap downloadBitmap(String url) {
    Bitmap bitmap = null;
    String newUrlString = url;

    try {
        // Change 500px image to 1000px image
        URL oldUrl = new URL(url);
        if (url.endsWith("500.jpg")) {
            newUrlString = oldUrl.toString().replaceFirst("500.jpg", "1000.jpg");
        }

        InputStream inputStream = new URL(newUrlString).openStream();
        bitmap = BitmapFactory.decodeStream(inputStream);
    } catch (Exception e) {
        Log.e(LOG_TAG, e.getMessage());
    }
    return bitmap;
}
请尝试以下操作:

protected class ImageLoader extends AsyncTask<String, Void, Bitmap> {
        protected Bitmap doInBackground(String... urls) {
            Bitmap bitmap = null;
            String originalUrl = urls[0];
            String url = urls[0].replaceFirst("/500.", "/1000.");
            try {
                InputStream inputStream = new URL(url).openStream();
                bitmap = BitmapFactory.decodeStream(inputStream);
            } catch (Exception e) {
                try {
                    InputStream inputStream = new URL(originalUrl).openStream();
                    bitmap = BitmapFactory.decodeStream(inputStream);
                } catch (Exception ignored) {
                }
            }
            return bitmap;
        }

        protected void onPostExecute(Bitmap bitmap) {
            //do whatever you want with the result.
            if(bitmap!=null)
            image.setImageBitmap(bitmap);
        }
    }
受保护的类ImageLoader扩展了异步任务{
受保护位图doInBackground(字符串…URL){
位图=空;
字符串originalUrl=URL[0];
字符串url=url[0].replaceFirst(“/500.”,“/1000.”);
试一试{
InputStream InputStream=新URL(URL).openStream();
位图=BitmapFactory.decodeStream(inputStream);
}捕获(例外e){
试一试{
InputStream InputStream=新URL(originalUrl).openStream();
位图=BitmapFactory.decodeStream(inputStream);
}捕获(忽略异常){
}
}
返回位图;
}
受保护的void onPostExecute(位图){
//对结果做任何你想做的事。
if(位图!=null)
setImageBitmap(位图);
}
}
我在这里所做的是创建了一个名为ImageLoader的异步任务(因为您的原始代码将抛出
NetworkOnMainThreadException
)。它将处理图像url的请求;如果无法获取1000px版本,它将故障切换到映像的500px版本。
希望这能有所帮助。

谢谢穆罕默德!在本课程中,我不允许使用图书馆,除非它们与所涵盖的课程完全无关。课程结束后,我将使用毕加索为我的应用程序处理下载的图像。好的,我已经相应地更新了代码。请注意,您不应该通过主线程进行网络调用。相反,使用多线程,例如将加载URL的代码放入异步任务或服务中。谢谢!我把它放在QueryUtils.java文件的底部。我想知道如何处理原始url向我抛出的任何大小,并将其更改为1000。我遇到过一些是800、250和其他随机数。所以不能搜索并用1000替换500。换句话说,如果anySize<1000,那么anySize==1000。我只是不知道如何像那样提取它。试试这个
stringurl=”http://mywebsite.com/2309.jpg";
字符串url\u 1000=url.replace(url.substring(url.lastIndexOf(“/”),“/1000.jpg”)谢谢这工作得很好!因为我已经在QuyReutiLS.java类中拥有它而不是主线程,所以我使用了您在中间提供的代码,然后根据您最近的注释更新它。我无法投票支持你的答案,因为我没有足够的代表分数,但可以给你接受的答案!!