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

标签 java android split android-image

通过 API,我从 URL 字符串中获取类似于以下格式的缩略图: https://website.com/05b8a817448d0e2/0_167_3000_1799/500.jpg 。然而,对于 Android 应用程序开发来说,它看起来很困惑。

API 没有提供高分辨率图像。但是,我发现通过更改 URL 的末尾,图像会以 1000px 甚至 2000px 的形式存在。

我想将 URL 字符串更改为存在于同一位置且具有改进后缀的高分辨率版本: https://website.com/05b8a817448d0e2/0_167_3000_1799/1000.jpg

额外要求:

  • API 很少会提供 500 以外的其他大小,例如 1000 或 250
  • 在极少数情况下,它以 .png 而不是 .jpg 结尾(甚至可能是其他格式)
  • 在极少数情况下,图像不存在更高的分辨率,应单独保留

因此,该解决方案需要比我当前的编码能力更加强大。

这是我在 Android Studio 中的代码块,它工作正常,但不涵盖额外的要求。我只在 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 的 AsyncTask (因为您的原始代码将抛出 NetworkOnMainThreadException )。它将处理请求图像 url;如果无法获取 1000px 版本,则会故障转移到 500px 版本的图像。 希望这会有所帮助。

关于java - 如何将 URL 字符串末尾的低分辨率图像引用替换为可用的高分辨率图像引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51587354/

相关文章:

java - 标准查询的链接是一种好的做法吗?

java - 如何使用 jni 将数据从 java InputStream 移动到 C++ 中的 char *?

Android Studio 3.2 - 找不到 com.android.tools.build :aapt2:3. 2.0-4818971

Android:使用jackson逐对象解析JSON对象

java - 如何从分隔字符串中获取值?

java - 将起始字母字符与数字字符分开

java - 使用 DynamoDBMapper 是个坏主意吗?

java - png 格式的背景图像未以堆栈面板质量渲染

Android动态创建按钮并填充布局

Python 在换行符上拆分字符串并保留换行符