[Android] 获取网络图片并显示

版权声明:本文为博主原创文章,技术需要传递,欢迎分享。 https://blog.csdn.net/yuxin1100/article/details/51660084

使用 HttpURLConnection 获得连接,再使用 InputStream 获得图片的数据流,通过 BitmapFactory 将数据流转换为 Bitmap,再将 Bitmap 通过线程的 Message 发送出去,Handler 接收到消息就会通知 ImageView 显示出来。

记得要在manifest文件中添加 < uses-permission android:name=”android.permission.INTERNET” />上网权限,不然无法显示图片。

工程文件结构:

布局文件中就一个 ImageView 用来显示图片,一个 Button 用来获取图片。

MainActivity.java

public class MainActivity extends AppCompatActivity {
    Button button;
    ImageView imageView;
    String url = "http://i4.buimg.com/dccba6282641a9e0.jpg";
    //String textURL = "http://192.168.1.104:8080/add.jsp";

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

        button = (Button) findViewById(R.id.button);
        imageView = (ImageView) findViewById(R.id.imageView);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Bitmap bmp = getURLimage(url);
                        Message msg = new Message();
                        msg.what = 0;
                        msg.obj = bmp;
                        System.out.println("000");
                        handle.sendMessage(msg);
                    }
                }).start();
            }
        });
    }

    //在消息队列中实现对控件的更改
    private Handler handle = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 0:
                    System.out.println("111");
                    Bitmap bmp=(Bitmap)msg.obj;
                    imageView.setImageBitmap(bmp);
                    break;
            }
        };
    };

    //加载图片
    public Bitmap getURLimage(String url) {
        Bitmap bmp = null;
        try {
            URL myurl = new URL(url);
            // 获得连接
            HttpURLConnection conn = (HttpURLConnection) myurl.openConnection();
            conn.setConnectTimeout(6000);//设置超时
            conn.setDoInput(true);
            conn.setUseCaches(false);//不缓存
            conn.connect();
            InputStream is = conn.getInputStream();//获得图片的数据流
            bmp = BitmapFactory.decodeStream(is);//读取图像数据
            //读取文本数据
            //byte[] buffer = new byte[100];
            //inputStream.read(buffer);
            //text = new String(buffer);
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bmp;
    }
}

android获取网络图片显示的问题

05-20

我在网上看了一些解析图片的代码,然后用一些网站的图片进行测试,但是当解析我的网站的图片的时候,就直接报错,我个人认为应该是我的网站的图片太大的缘故,然后我按照网上给的图片压缩的方法进行尝试,但是发现没有什么效果,不知道是什么原因,恳请各位指教。少都不说了直接上代码:rnprotected void onCreate(Bundle savedInstanceState) rnsuper.onCreate(savedInstanceState);rnsetContentView(R.layout.activity_main);rnrnrnrnbutton = (Button)findViewById(R.id.buttonId);rnbutton.setOnClickListener(new OnClickListener() rnrn@Overridernpublic void onClick(View v) rnmyAsyncTask = new MyAsyncTask();rnmyAsyncTask.execute();rnrn);rnimageView=(ImageView)findViewById(R.id.imageViewId);rnrnrn//下载图片rnpublic void loadImageFromUrl() rnURL m;rn// String url=“http://news.ucas.ac.cn/Content/Upload/2014/5/315.jpg”//这个链接是网站需要的图片rnString url="http:////imgsrc.baidu.com/forum/pic/item/0a6d462c11dfa9eca10597e560d0f703908fc15c.jpg"// 测试用的图片rnInputStream i = null;rnBufferedInputStream bis = null;rnByteArrayOutputStream outStream = new ByteArrayOutputStream(); rntry rnm = new URL(url);rni = (InputStream) m.getContent();rnbis = new BufferedInputStream(i,1024 * 8);rnrnrnBitmapFactory.Options options = new BitmapFactory.Options();rnoptions.inJustDecodeBounds = true; rn// 从输入流读取数据 rnbyte[] data = StreamTool.read(bis);rnBitmapFactory.decodeByteArray(data, 0, data.length, options); rnint w = options.outWidth; rnint h = options.outHeight; rn// 从服务器端获取的图片大小为:80x120 rn// 我们想要的图片大小为:40x40 rn// 缩放比:120/40 = 3,也就是说我们要的图片大小为原图的1/3 rnrn// 缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 rnint ratio = 1; // 默认为不缩放 rnif (w >= h && w > width) rnratio = (int) (w / width); rn else if (w < h && h > height) rnratio = (int) (h / height); rn rnrnif (ratio <= 0) rnratio = 1; rn rnrnSystem.out.println("图片的缩放比例值ratio = " + ratio); rnrnoptions.inJustDecodeBounds = false; rn// 属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2, rn// 则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。 rnoptions.inSampleSize = ratio; rnbitmap = BitmapFactory.decodeByteArray(data, 0, data.length); rn// 图片质量默认值为100,表示不压缩 rnint quality = 10; rn// PNG是无损的,将会忽略质量设置。因此,这里设置为JPEG rnbitmap.compress(Bitmap.CompressFormat.JPEG, quality, outStream); rn// 判断压缩后图片的大小是否大于100KB,大于则继续压缩 rnwhile (outStream.toByteArray().length / 1024 > 100) rnoutStream.reset(); rnrn// 压缩quality%,把压缩后的数据存放到baos中 rnbitmap.compress(Bitmap.CompressFormat.JPEG, quality, outStream); rnquality -= 10; rn rnSystem.out.println("quality = " + quality); rnrnbyte[] data01 = outStream.toByteArray(); rnbitmap01 = BitmapFactory.decodeByteArray(data, 0, data.length);rn catch (IOException e) rn// TODO Auto-generated catch blockrne.printStackTrace();rn rnSystem.out.println(bitmap01.getWidth()+"::"+bitmap01.getHeight());rnrnrnrnprivate Bitmap getBitmap()rnrnreturn bitmap01;rnrn//开启新的线程下载图片 rnprivate class MyAsyncTask extends AsyncTaskrnrn@Overridernprotected Void doInBackground(Object... params) rnloadImageFromUrl();rnreturn null;rnrnrnrn@Overridernprotected void onPostExecute(Void result) rnimageView.setImageBitmap(getBitmap());rn//imageView.invalidate();rnrnrnrnrnrnrnrn不清楚是啥原因,望知道的大神告知。。。万分感谢 论坛

没有更多推荐了,返回首页