我目前正在使用以下代码将图像作为可绘制对象加载到URL中。
Drawable drawable_from_url(String url, String src_name)
throws java.net.MalformedURLException, java.io.IOException {
return Drawable.createFromStream(((java.io.InputStream)new java.net.URL(url).getContent()), src_name);
}
此代码完全符合要求,但似乎存在兼容性问题。在1.5版本中,当我给它一个URL时,它会抛出FileNotFoundException
。在2.2中,给定完全相同的URL,它工作正常。以下URL是我提供此功能的示例输入。
http://bks6.books.google.com/books?id=aH7BPTrwNXUC&printsec=frontcover&img=1&zoom=5&edge=curl&sig=ACfU3U2aQRnAX2o2ny2xFC1GmVn22almpg
如何以一种与网络兼容的方式加载图像?
答案 0 :(得分:45)
位图不是Drawable。如果你真的需要Drawable这样做:
public static Drawable drawableFromUrl(String url) throws IOException {
Bitmap x;
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.connect();
InputStream input = connection.getInputStream();
x = BitmapFactory.decodeStream(input);
return new BitmapDrawable(x);
}
答案 1 :(得分:15)
自己解决了。我使用以下代码将其作为位图加载。
Bitmap drawable_from_url(String url) throws java.net.MalformedURLException, java.io.IOException {
HttpURLConnection connection = (HttpURLConnection)new URL(url) .openConnection();
connection.setRequestProperty("User-agent","Mozilla/4.0");
connection.connect();
InputStream input = connection.getInputStream();
return BitmapFactory.decodeStream(input);
}
在用户代理中添加也很重要,因为如果不存在,googlebooks会拒绝访问
答案 2 :(得分:5)
我不确定,但我认为Drawable.createFromStream()更适用于本地文件而不是下载的InputStreams。尝试使用BitmapFactory.decodeStream()
,然后将返回的位图包装在BitmapDrawable。
答案 3 :(得分:1)
以下代码适用于我:
Matrix Mat = new Matrix();
Bitmap Source = BitmapFactory.decodeFile("ItemImagePath");
Bitmap Destination = Bitmap.createScaledBitmap( Source, 320, 320, true );
Source = Bitmap.createBitmap( Destination, 0, 0, Destination.getWidth(), Destination.getHeight(),Mat, true );
ItemImageView.setImageBitmap(Source);
答案 4 :(得分:1)
你可以使用com.androidquery.AndroidQuery来做到这一点。例如:
AQuery aq = new AQuery(this);
aq.id(view).image("http://yourserver/yourimage.png", true, true, 300, new BitmapAjaxCallback() {
@Override
public void callback(String url, ImageView imageView, Bitmap bitmap, AjaxStatus status) {
Drawable drawable = new BitmapDrawable(getResources(), bm);
}
});
如果您使用BitmapAjaxCallback,您将可以访问BitMap,您可以将其包装为BitmapDrawable。
答案 5 :(得分:0)
要从URL获取Drawable图像,必须使用AsyncTask
来避免NetWorkOnMainThreadException
,在onPostExecute()
中获得的Drawable结果可以设置为ImageView:
final String urlImage = "https://www.android.com/static/2016/img/hero-carousel/banner-android-p-2.jpg";
new AsyncTask<String, Integer, Drawable>(){
@Override
protected Drawable doInBackground(String... strings) {
Bitmap bmp = null;
try {
HttpURLConnection connection = (HttpURLConnection) new URL(urlImage).openConnection();
connection.connect();
InputStream input = connection.getInputStream();
bmp = BitmapFactory.decodeStream(input);
} catch (IOException e) {
e.printStackTrace();
}
return new BitmapDrawable(bmp);
}
protected void onPostExecute(Drawable result) {
//Add image to ImageView
myImageView.setImageDrawable(result);
}
}.execute();