从 url 获取位图的挑战
A challenge to get the Bitmap from from url
我知道这个问题有很多答案,但它是一个挑战,我只希望有兴趣的人试一试。
http://api.pt-helper.com/ptimages/web/uploads/Median%20Nerve%20Glide%20–%20D%202_300.png
上面是需要抓取并显示在ImageView中的图片url。问题是图像没有从 URL 正确加载。
我想 post wt 很有挑战性,因为 zgc7009 已经设法找到正确答案并理解我的问题。
- 在上面的 url 中有
–
个字符,它不是连字符而是 EN DASH
,在末尾附近有十六进制代码 e2 80 93
。所以它在浏览器上运行但无法在 Androi 设备上加载。好吧 Glide
确实加载了它,我必须说它是一个了不起的库。
感谢大家抽出宝贵的时间来解决这个问题。
使用 Volley's ImageRequest
从 URL
获取图像
public static final String URL = "http://api.pt-helper.com/ptimages/web/uploads/Median%20Nerve%20Glide%20–%20D%202_300.png";
ImageRequest imageRequest = new ImageRequest(URL, new Response.Listener<Bitmap>() {
@Override
public void onResponse(final Bitmap response) {
your_imageView.setImageBitmap(response);
}
}, 0, 0, ImageView.ScaleType.CENTER_INSIDE, null, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(your_activity_name.this, error.toString(), Toast.LENGTH_LONG).show();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(RescuingActivity.this);
requestQueue.add(imageRequest);
如果它的图片很重,请使用 AsyncTask
在 background thread
中加载它
注意:确保您在清单文件中添加了互联网权限。
public class LoadImageWebActivity extends Activity {
/** Called when the activity is first created. */
ImageView imgLogo;
ProgressBar progressbar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imgLogo = (ImageView) findViewById(R.id.imageView1);
progressbar = (ProgressBar) findViewById(R.id.loadingBar);
}
public void btnLoadImageClick(View view)
{
//imgLogo.setBackgroundDrawable(LoadImageFromWeb("http://www.android.com/media/wallpaper/gif/android_logo.gif"));
new loadImageTask().execute("http://api.pt-helper.com/ptimages/web/uploads/Median%20Nerve%20Glide%20–%20D%202_300.png");
}
public class loadImageTask extends AsyncTask<String, Void, Void>
{
Drawable imgLoad;
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
progressbar.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(String... params) {
// TODO Auto-generated method stub
imgLoad = LoadImageFromWeb(params[0]);
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if(progressbar.isShown())
{
progressbar.setVisibility(View.GONE);
imgLogo.setVisibility(View.VISIBLE);
imgLogo.setBackgroundDrawable(imgLoad);
}
}
}
public static Drawable LoadImageFromWeb(String url)
{
try
{
InputStream is = (InputStream) new URL(url).getContent();
Drawable d = Drawable.createFromStream(is, "src name");
return d;
} catch (Exception e) {
return null;
}
}
}
布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:text="Load Image"
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:onClick="btnLoadImageClick">
</Button>
<RelativeLayout
android:id="@+id/sublayout"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_below="@+id/button1">
<ProgressBar
android:id="@+id/loadingBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="gone">
</ProgressBar>
<ImageView
android:id="@+id/imageView1"
android:layout_height="200dp"
android:layout_width="200dp"
android:scaleType="center"
android:layout_centerInParent="true">
</ImageView>
</RelativeLayout>
</RelativeLayout>
我正在使用 glide 库从 URL 获取图像。我刚刚使用了下面的代码
Glide.with(activityRef)
.load("http://api.pt-helper.com/ptimages/web/uploads/Median%20Nerve%20Glide%20–%20D%202_300.png")
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.crossFade()
.override(1700, 1700)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(viewHolder.feedImage);
}
不到一秒钟我就得到了图像!
我收回 一些 评论的严厉 :P 你提供的 url 确实在浏览器中显示了图像,但我无法将其显示到使用提供的 url 使用 Picasso 库加载图像。但是,在检查元素并在图像本身中使用来自图像源的 url 之后,恰好是
http://api.pt-helper.com/ptimages/web/uploads/Median%20Nerve%20Glide%20%E2%80%93%20D%202_300.png
我可以用 Picasso 提取图像。
我知道这个问题有很多答案,但它是一个挑战,我只希望有兴趣的人试一试。
http://api.pt-helper.com/ptimages/web/uploads/Median%20Nerve%20Glide%20–%20D%202_300.png
上面是需要抓取并显示在ImageView中的图片url。问题是图像没有从 URL 正确加载。
我想 post wt 很有挑战性,因为 zgc7009 已经设法找到正确答案并理解我的问题。
- 在上面的 url 中有
–
个字符,它不是连字符而是EN DASH
,在末尾附近有十六进制代码e2 80 93
。所以它在浏览器上运行但无法在 Androi 设备上加载。好吧Glide
确实加载了它,我必须说它是一个了不起的库。
感谢大家抽出宝贵的时间来解决这个问题。
使用 Volley's ImageRequest
从 URL
public static final String URL = "http://api.pt-helper.com/ptimages/web/uploads/Median%20Nerve%20Glide%20–%20D%202_300.png";
ImageRequest imageRequest = new ImageRequest(URL, new Response.Listener<Bitmap>() {
@Override
public void onResponse(final Bitmap response) {
your_imageView.setImageBitmap(response);
}
}, 0, 0, ImageView.ScaleType.CENTER_INSIDE, null, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(your_activity_name.this, error.toString(), Toast.LENGTH_LONG).show();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(RescuingActivity.this);
requestQueue.add(imageRequest);
如果它的图片很重,请使用 AsyncTask
background thread
中加载它
注意:确保您在清单文件中添加了互联网权限。
public class LoadImageWebActivity extends Activity {
/** Called when the activity is first created. */
ImageView imgLogo;
ProgressBar progressbar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imgLogo = (ImageView) findViewById(R.id.imageView1);
progressbar = (ProgressBar) findViewById(R.id.loadingBar);
}
public void btnLoadImageClick(View view)
{
//imgLogo.setBackgroundDrawable(LoadImageFromWeb("http://www.android.com/media/wallpaper/gif/android_logo.gif"));
new loadImageTask().execute("http://api.pt-helper.com/ptimages/web/uploads/Median%20Nerve%20Glide%20–%20D%202_300.png");
}
public class loadImageTask extends AsyncTask<String, Void, Void>
{
Drawable imgLoad;
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
progressbar.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(String... params) {
// TODO Auto-generated method stub
imgLoad = LoadImageFromWeb(params[0]);
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if(progressbar.isShown())
{
progressbar.setVisibility(View.GONE);
imgLogo.setVisibility(View.VISIBLE);
imgLogo.setBackgroundDrawable(imgLoad);
}
}
}
public static Drawable LoadImageFromWeb(String url)
{
try
{
InputStream is = (InputStream) new URL(url).getContent();
Drawable d = Drawable.createFromStream(is, "src name");
return d;
} catch (Exception e) {
return null;
}
}
}
布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:text="Load Image"
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:onClick="btnLoadImageClick">
</Button>
<RelativeLayout
android:id="@+id/sublayout"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_below="@+id/button1">
<ProgressBar
android:id="@+id/loadingBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="gone">
</ProgressBar>
<ImageView
android:id="@+id/imageView1"
android:layout_height="200dp"
android:layout_width="200dp"
android:scaleType="center"
android:layout_centerInParent="true">
</ImageView>
</RelativeLayout>
</RelativeLayout>
我正在使用 glide 库从 URL 获取图像。我刚刚使用了下面的代码
Glide.with(activityRef)
.load("http://api.pt-helper.com/ptimages/web/uploads/Median%20Nerve%20Glide%20–%20D%202_300.png")
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.crossFade()
.override(1700, 1700)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(viewHolder.feedImage);
}
不到一秒钟我就得到了图像!
我收回 一些 评论的严厉 :P 你提供的 url 确实在浏览器中显示了图像,但我无法将其显示到使用提供的 url 使用 Picasso 库加载图像。但是,在检查元素并在图像本身中使用来自图像源的 url 之后,恰好是
http://api.pt-helper.com/ptimages/web/uploads/Median%20Nerve%20Glide%20%E2%80%93%20D%202_300.png
我可以用 Picasso 提取图像。