Android 从服务器获取位图图像以在ImageView上设置

Android 从服务器获取位图图像以在ImageView上设置,android,android-image,bitmapimage,Android,Android Image,Bitmapimage,我在服务器上有多个映像。我要做的是从服务器检索这些图像,并将其设置在imageView上 我已经从服务器获取了blob类型的图像,将其解码为字节数组,然后将其转换为位图图像 我对如何从服务器获取位图图像感到困惑 我经历了很多这样的问题 请给任何人一个链接或代码 谢谢你宝贵的时间 我一直在尝试,下面是代码: public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanc

我在服务器上有多个映像。我要做的是从服务器检索这些图像,并将其设置在imageView上

我已经从服务器获取了blob类型的图像,将其解码为字节数组,然后将其转换为位图图像

我对如何从服务器获取位图图像感到困惑

我经历了很多这样的问题

请给任何人一个链接或代码

谢谢你宝贵的时间

我一直在尝试,下面是代码:

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

Bitmap bitmap = DownloadImage("http://www.allindiaflorist.com/imgs/arrangemen4.jpg");


    ImageView img = (ImageView) findViewById(R.id.img);
    img.setImageBitmap(bitmap);
}

private InputStream OpenHttpConnection(String urlString) 
throws IOException
{
    InputStream in = null;
    int response = -1;

    URL url = new URL(urlString); 
    URLConnection conn = url.openConnection();

    if (!(conn instanceof HttpURLConnection))                     
        throw new IOException("Not an HTTP connection");

    try{
        HttpURLConnection httpConn = (HttpURLConnection) conn;
        httpConn.setAllowUserInteraction(false);
        httpConn.setInstanceFollowRedirects(true);
        httpConn.setRequestMethod("GET");
        httpConn.connect();
        response = httpConn.getResponseCode();                 
        if (response == HttpURLConnection.HTTP_OK) {
            in = httpConn.getInputStream();                                 
        }                     
    }
    catch (Exception ex)
    {
        throw new IOException("Error connecting");            
    }
    return in;     
}
private Bitmap DownloadImage(String URL)
{        
    Bitmap bitmap = null;
    InputStream in = null;   



    try {
        in = OpenHttpConnection(URL);
        BufferedInputStream bis = new BufferedInputStream(in, 8190);

        ByteArrayBuffer baf = new ByteArrayBuffer(50);
        System.out.println("BAF= "+baf);
        int current = 0;
        while ((current = bis.read()) != -1) 
        {
            baf.append((byte)current);
        }
        byte[] imageData = baf.toByteArray();
        System.out.println("imageData= "+imageData);
        bitmap =BitmapFactory.decodeByteArray(imageData, 0, imageData.length);
        in.close();
    } 
   catch (IOException e1) 
   {

        e1.printStackTrace();
    }
    return bitmap;                
}
}

这将返回图像,但我使用的url包含图像名称。若我有更多的图像,并希望在应用程序加载时检索所有图像,该怎么办呢?

我建议使用库,它可以异步下载图像,然后使用一个回调函数,侦听器将url和位图图像作为参数。

我建议使用库,它的功能是异步下载图像,然后回调一个侦听器,将url和位图图像作为参数。

我建议您使用另一种类似于魅力的方式:Android查询

您可以从此处下载该jar文件:

例如:

androidAQuery.id(YOUR IMAGEVIEW).image(YOUR IMAGE TO LOAD, true, true, getDeviceWidth(), ANY DEFAULT IMAGE YOU WANT TO SHOW);
使用上述代码,您可以通过url直接显示您的图像。下面的代码是直接从url获取位图:

androidAQuery.ajax(YOUR IMAGE URL,Bitmap.class,0,new AjaxCallback<Bitmap>(){
                        @Override
                        public void callback(String url, Bitmap object, AjaxStatus status) {
                            super.callback(url, object, status);

                            //You will get Bitmap from object.
                        }


  });
这个库是由Android本身提供的,所以使用它并查看结果


这是非常快速和准确的,使用它你可以找到更多的功能,如动画加载时;如果需要,获取位图;等等。

我建议您使用另一种类似于魅力的方式:Android查询

您可以从此处下载该jar文件:

例如:

androidAQuery.id(YOUR IMAGEVIEW).image(YOUR IMAGE TO LOAD, true, true, getDeviceWidth(), ANY DEFAULT IMAGE YOU WANT TO SHOW);
使用上述代码,您可以通过url直接显示您的图像。下面的代码是直接从url获取位图:

androidAQuery.ajax(YOUR IMAGE URL,Bitmap.class,0,new AjaxCallback<Bitmap>(){
                        @Override
                        public void callback(String url, Bitmap object, AjaxStatus status) {
                            super.callback(url, object, status);

                            //You will get Bitmap from object.
                        }


  });
这个库是由Android本身提供的,所以使用它并查看结果


这是非常快速和准确的,使用它你可以找到更多的功能,如动画加载时;如果需要,获取位图;等等。

我建议您使用演示文稿中的库,与Google在其应用程序Google Play中使用的库相同。在谷歌I/O13上,菲库斯·基尔克帕特里克(Ficus Kilkpatrick)凌空抽射。Volley是一个HTTP库,旨在删除大量样板代码,简化列表中图像的处理,更快,抽象出一个或另一个HTTP客户端的复杂性

初始化

Volley依赖于处理请求队列的RequestQueue和负责加载图像的ImageLoader。我们每个人都需要一个

public static ImageLoader mImageLoader;
public static RequestQueue mRequestQueue;
我们还需要初始化它们。队列需要上下文,ImageLoader需要ImageCache。在这里,我使用一个基本的包装器来实现LruCache

mRequestQueue = Volley.newRequestQueue(this);
mImageLoader = new ImageLoader(mRequestQueue, new BitmapLru(64000));
初始化在第一个活动的onCreate中完成

获取图像

假设您必须用从服务器下载的图像填充gridview。ImageUrlAdapter使用NetworkImageView填充GridView或任何AdapterView。这是Volley提供的一个类,用于将网络中的图像放入ImageView。它实际上扩展了ImageView,这意味着您可以在使用ImageView的任何地方使用它。它使用起来非常简单。适配器中唯一的代码是getView

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    NetworkImageView imageView;
    if (convertView == null) {
        imageView = new NetworkImageView(getContext());
    } else {
        imageView = (NetworkImageView) convertView;
    }
    String url = getItem(position);
    imageView.setImageUrl(url, MainActivity.mImageLoader);
    return imageView;
}
这里唯一的新功能是imageView.setImageUrlurl,MainActivity.mImageLoader


就这样。不需要更多内容。

我建议您使用演示文稿中的库,即Google在其应用程序Google Play中使用的库。在谷歌I/O13上,菲库斯·基尔克帕特里克(Ficus Kilkpatrick)凌空抽射。Volley是一个HTTP库,旨在删除大量样板代码,简化列表中图像的处理,更快,抽象出一个或另一个HTTP客户端的复杂性

初始化

Volley依赖于处理请求队列的RequestQueue和负责加载图像的ImageLoader。我们每个人都需要一个

public static ImageLoader mImageLoader;
public static RequestQueue mRequestQueue;
我们还需要初始化它们。队列需要上下文,ImageLoader需要ImageCache。在这里,我使用一个基本的包装器来实现LruCache

mRequestQueue = Volley.newRequestQueue(this);
mImageLoader = new ImageLoader(mRequestQueue, new BitmapLru(64000));
初始化在第一个活动的onCreate中完成

获取图像

假设您必须用从服务器下载的图像填充gridview。ImageUrlAdapter使用NetworkImageView填充GridView或任何AdapterView。这是Volley提供的一个类,用于将网络中的图像放入ImageView。它实际上扩展了ImageView,这意味着您可以在使用ImageView的任何地方使用它。它使用起来非常简单。适配器中唯一的代码是getView

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    NetworkImageView imageView;
    if (convertView == null) {
        imageView = new NetworkImageView(getContext());
    } else {
        imageView = (NetworkImageView) convertView;
    }
    String url = getItem(position);
    imageView.setImageUrl(url, MainActivity.mImageLoader);
    return imageView;
}
这里唯一的新功能是imageView.setImageUrlurl,MainActivity.mImageLoader


就这样。不需要更多了。

我强烈建议使用Square的库。它非常容易使用,并且消除了检索缓存的所有痛苦。

我强烈建议使用广场的图书馆。它非常容易使用,并且消除了检索缓存的所有痛苦。

使用

既然你糊涂了,我会解释的

通过单击下载jar文件并将其粘贴到libs文件夹中

在清单中添加这两行权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
或者,如果您只需要位图,请使用此

Bitmap bmp = imageLoader.loadImageSync("http://www.allindiaflorist.com/imgs/arrangemen4.jpg");
使用

既然你糊涂了,我会解释的

通过单击下载jar文件并将其粘贴到libs文件夹中

在清单中添加这两行权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
或者,如果您只需要位图,请使用此

Bitmap bmp = imageLoader.loadImageSync("http://www.allindiaflorist.com/imgs/arrangemen4.jpg");


查看本教程,了解如何使用AsyncTask从服务器异步下载图像:volley、picasso、prime…感谢大家的回答。但每个人都在建议一种不同的技术,我对所有这些都是新手,这让我更加困惑。请查看本教程,了解如何使用AsyncTask从服务器异步下载图像:volley、picasso、prime…感谢大家的回答。但是每个人都在建议一种不同的技术,我对所有这些都是新手,这让我更加困惑。好吧,试试看,如果这篇文章对你有帮助,那么请接受并投票,这样其他人就可以使用它。你提供的链接包括各种jar文件。我应该下载所有的还是有一个特定的。不,只做一个,只做第一个或第二个。嘿,我已经更新了我的问题。你能告诉我代码还需要什么吗?无论你想要什么图片,一次获取所有的url,并将它们存储在数组或arraylist中,然后使用loop处理Android查询。所以你的图片会一个接一个地被下载和显示。好的,试试看,如果这篇文章对你有帮助,那么请接受并投票,这样其他人可以使用。你提供的链接包括各种jar文件。我应该下载所有的还是有一个特定的。不,只做一个,只做第一个或第二个。嘿,我已经更新了我的问题。你能告诉我代码还需要什么吗?无论你想要什么图片,一次获取所有的url,并将它们存储在数组或arraylist中,然后使用loop处理Android查询。所以,你的图像将一个接一个地被下载和显示。嘿,我正在看视频。我还可以用这个从服务器上检索.zip文件吗?你要做的是克隆项目存储库git clone并将其作为Android库导入到你的IDE中,最后从你的项目中引用导入的项目以使用它。嘿,我正在看视频。我还可以使用此工具从服务器检索.zip文件吗?您需要做的是克隆项目存储库git clone并将其作为Android库导入IDE中,最后从您的项目中引用导入的项目以使用它。