网络图片_网络图片下载 - CSDN
精华内容
参与话题
  • 加载网络图片显示大图

    千次阅读 2016-03-02 23:10:33
    1.将图片的uri列表和下标传给ImagePagerActivity public void imageBrower(int position, ArrayList urls2) { Intent intent = new Intent(this, ImagePagerActivity.class); intent.putExtra(ImagePagerActivity...

    1.将图片的uri列表和下标传给ImagePagerActivity

    public void imageBrower(int position, ArrayList<String> urls2) {
        Intent intent = new Intent(this, ImagePagerActivity.class);
        intent.putExtra(ImagePagerActivity.EXTRA_IMAGE_URLS, urls2);
        intent.putExtra(ImagePagerActivity.EXTRA_IMAGE_INDEX, position);
        this.startActivity(intent);
    }

    2.给ImagePagerActivity布局:layout里布局:

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
                 android:layout_width="match_parent"
                 android:layout_height="match_parent">
    
        <com.yangzi.homeimprovement.imagedemo.HackyViewPager
            android:id="@+id/pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/black"/>
    
        <TextView
            android:id="@+id/indicator"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:background="@android:color/transparent"
            android:gravity="center"
            android:text="@string/viewpager_indicator"
            android:textColor="@android:color/white"
            android:textSize="18sp"/>
        <!--  viewpager_indicator===>> string文件夹下: <string name="viewpager_indicator">%1$d/%2$d</string>-->
    </FrameLayout>

    3.关联布局--->写一个继承FragmentStatePagerAdapter的类显示图片

       --->更新下标

    /**
     * 图片查看器
     */
    public class ImagePagerActivity extends FragmentActivity {
        private static final String STATE_POSITION = "STATE_POSITION";
        public static final String EXTRA_IMAGE_INDEX = "image_index";
        public static final String EXTRA_IMAGE_URLS = "image_urls";
    
        private ViewPager mPager;
        private int pagerPosition;
        private TextView indicator;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.image_detail_pager);
    
            pagerPosition = getIntent().getIntExtra(EXTRA_IMAGE_INDEX, 0);
            ArrayList<String> urls = getIntent().getStringArrayListExtra(EXTRA_IMAGE_URLS);//intent传过来的显示大图的Uri
    
            mPager = (ViewPager) findViewById(R.id.pager);
            ImagePagerAdapter mAdapter = new ImagePagerAdapter(getSupportFragmentManager(), urls);
            mPager.setAdapter(mAdapter);
            indicator = (TextView) findViewById(R.id.indicator);
    
            CharSequence text = getString(R.string.viewpager_indicator, 1, mPager.getAdapter().getCount());
            indicator.setText(text);
            // 更新图片的下标
            mPager.setOnPageChangeListener(new OnPageChangeListener() {
    
                @Override
                public void onPageScrollStateChanged(int arg0) {
                }
    
                @Override
                public void onPageScrolled(int arg0, float arg1, int arg2) {
                }
    
                @Override
                public void onPageSelected(int arg0) {
                    CharSequence text = getString(R.string.viewpager_indicator, arg0 + 1, mPager.getAdapter().getCount());// 后面的参数填充参数1
    
                    indicator.setText(text);
                }
    
            });
            if (savedInstanceState != null) {
                pagerPosition = savedInstanceState.getInt(STATE_POSITION);
            }
            mPager.setCurrentItem(pagerPosition);
        }
    
        @Override
        public void onSaveInstanceState(Bundle outState) {
            outState.putInt(STATE_POSITION, mPager.getCurrentItem());
        }
        
        // 显示图片
        private class ImagePagerAdapter extends FragmentStatePagerAdapter {// Fragment 对应的数据集发生改变时,用它较好
    
            public ArrayList<String> fileList;
    
            public ImagePagerAdapter(FragmentManager fm, ArrayList<String> fileList) {
                super(fm);
                this.fileList = fileList;
            }
    
            @Override
            public int getCount() {
                return fileList == null ? 0 : fileList.size();//如果uri列表不为空,得到uriList的大小
            }
    
            @Override
            public Fragment getItem(int position) {
                String url = fileList.get(position);
                return ImageDetailFragment.newInstance(url);
            }
        }
    }

    4.显示图片 这里用到了使用Android-Universal-Image-Loader 图片异步加载类库

    /**
     * 单张图片显示Fragment
     */
    public class ImageDetailFragment extends Fragment {
        private String mImageUrl;
        private ImageView mImageView;
        private ProgressBar progressBar;
        private PhotoViewAttacher mAttacher;
    
        public static ImageDetailFragment newInstance(String imageUrl) {
            final ImageDetailFragment f = new ImageDetailFragment();
    
            final Bundle args = new Bundle();
            args.putString("url", imageUrl);
            f.setArguments(args);//Fragment不要用构造方法传参
            return f;
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //在构造方法里用setArguments传递过来的参数不为空,就得到大图的Url
            mImageUrl = getArguments() != null ? getArguments().getString("url") : null;
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            final View v = inflater.inflate(R.layout.image_detail_fragment, container, false);
            mImageView = (ImageView) v.findViewById(R.id.image);
            mAttacher = new PhotoViewAttacher(mImageView);
    
            mAttacher.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() {
    
                @Override
                public void onPhotoTap(View arg0, float arg1, float arg2) {
                    getActivity().finish();
                }
            });
    
            progressBar = (ProgressBar) v.findViewById(R.id.loading);
            return v;
        }
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
    
            ImageLoader.getInstance().displayImage(mImageUrl, mImageView, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingStarted(String imageUri, View view) {
                    progressBar.setVisibility(View.VISIBLE);
                }
    
                @Override
                public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
                    String message = null;
                    switch (failReason.getType()) {
                        case IO_ERROR:
                            message = "下载错误";
                            break;
                        case DECODING_ERROR:
                            message = "图片无法显示";
                            break;
                        case NETWORK_DENIED:
                            message = "网络有问题,无法下载";
                            break;
                        case OUT_OF_MEMORY:
                            message = "图片太大无法显示";
                            break;
                        case UNKNOWN:
                            message = "未知的错误";
                            break;
                    }
                    Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show();
                    progressBar.setVisibility(View.GONE);
                }
    
                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                    progressBar.setVisibility(View.GONE);
                    mAttacher.update();
                }
            });
        }
    }

    展开全文
  • 下载网络图片到本地

    2014-06-23 20:31:28
    error_reporting(0); date_default_timezone_set("Asia/shanghai"); header("Content-type:text/html;charset=utf-8"); $host = "localhost"; $port = ""; $user = "guanli"; $pwd = "heike.";...$conn =
    <?php     
    error_reporting(0);
    date_default_timezone_set("Asia/shanghai");
    header("Content-type:text/html;charset=utf-8");
    
    $host = "localhost";
    $port = "";
    $user = "root";
    $pwd  = "guanli";
    
    $conn = @ mysql_connect($host.":".$port, $user, $pwd) or die("Database connection error");
    if($dbconn=mysql_select_db("caiji", $conn)){
    
    }else{
        returnError("1010","Could not connect to mysql");
    }
    
    @mysql_query("set names 'utf8'");
    
        // 变量说明:     
        // $url 是远程图片的完整URL地址,不能为空。    
        // $filename 是可选变量: 如果为空,本地文件名将基于时间和日期     
        // 自动生成.     
            
        function get_photo($url,$filename='',$savefile='images/')   
        {     
            $imgArr = array('gif','bmp','png','ico','jpg','jepg');  
          
            if(!$url) return false;  
            
            if(!$filename) {     
              $ext=end(explode('/',$url));     
              
              $filename= $ext;     
            }     
           
            $filename = $savefile.$filename;  
          
            ob_start();     
            readfile($url);     
            $img = ob_get_contents();     
            ob_end_clean();     
            $size = strlen($img);     
            
            $fp2=@fopen($filename, "a");     
            fwrite($fp2,$img);     
            fclose($fp2);     
            
            return $filename;     
         }     
          
    
    
    $res = mysql_query("select * from caiji where id<100");
    
    $saveArr = array();//空的保存数组
    while($row = mysql_fetch_assoc($res)) {
       
        if($row['logo']){
            get_photo($row['logo']);
            echo $row['id'].":".$row['logo']."<br>";
        }
    
    }
    ?>

    批量下载图片会超时

    设置php.ini

    max_execution_time = 600 ;每个PHP页面运行的最大时间值(秒),默认30秒
    max_input_time = 600 ;每个PHP页面接收数据所需的最大时间,默认60秒
    memory_limit = 8m ;每个PHP页面所吃掉的最大内存,默认8M

    展开全文
  • 下载网络图片

    2011-06-09 15:44:09
    public String writeFile(String strUrl, String fileName) { String path="d:/webimg"; URL url = null; ... url = new URL(strUrl);... } catch (MalformedURLException e2) { ...
    public  String  writeFile(String strUrl, String fileName) {
    		 String path="d:/webimg";
    		URL url = null;
    		try {
    			url = new URL(strUrl);
    		} catch (MalformedURLException e2) {
    			e2.printStackTrace();
    		}
    		InputStream is = null;
    		try {
    			is = url.openStream();
    		} catch (IOException e1) {
    			path=null;
    			e1.printStackTrace();
    		}
    		OutputStream os = null;
    		File f = new File(path);
    		f.mkdirs();
    		try {
    			path=path+"/" + fileName;
    			os = new FileOutputStream(path);
    			int bytesRead = 0;
    			byte[] buffer = new byte[8192];
    			while ((bytesRead = is.read(buffer, 0, 8192)) != -1) {
    				os.write(buffer, 0, bytesRead);
    			}
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    			path=null;
    		} catch (IOException e) {
    			e.printStackTrace();
    			path=null;
    		}
    		
    		return path;
    	} 

     

    展开全文
  • 网络图片下载与缓存

    2015-07-20 16:17:55
    网络请求 主线程阻塞 UI停止刷新,应用无法响应用户操作 耗时操作不应该在主线程进行 ANR application not responding 应用无响应异常 主线程阻塞时间过长,就会抛出ANR 主线程又称UI线程,因为...

    网络请求

    主线程阻塞

    • UI停止刷新,应用无法响应用户操作
    • 耗时操作不应该在主线程进行
    • ANR

      • application not responding
      • 应用无响应异常
      • 主线程阻塞时间过长,就会抛出ANR
    • 主线程又称UI线程,因为只有在主线程中,才能刷新UI

    消息队列机制

    • 主线程创建时,系统会同时创建消息队列对象(MessageQueue)和消息轮询器对象(Looper)
    • 轮询器的作用,就是不停的检测消息队列中是否有消息(Message)
    • 消息队列一旦有消息,轮询器会把消息对象传给消息处理器(Handler),处理器会调用handleMessage方法来处理这条消息,handleMessage方法运行在主线程中,所以可以刷新ui
    • 总结:只要消息队列有消息,handleMessage方法就会调用
    • 子线程如果需要刷新ui,只需要往消息队列中发一条消息,触发handleMessage方法即可
    • 子线程使用处理器对象的sendMessage方法发送消息

     

    网络图片查看器

    • 确定图片的网址
    • 发送http请求

      URL url = new URL(address);
      //获取连接对象,并没有建立连接
      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
      //设置连接和读取超时
      conn.setConnectTimeout(5000);
      conn.setReadTimeout(5000);
      //设置请求方法,注意必须大写
      conn.setRequestMethod("GET");
      //建立连接,发送get请求
      //conn.connect();
      //建立连接,然后获取响应吗,200说明请求成功
      conn.getResponseCode();
      
    • 服务器的图片是以流的形式返回给浏览器的

      //拿到服务器返回的输入流
      InputStream is = conn.getInputStream();
      //把流里的数据读取出来,并构造成图片
      Bitmap bm = BitmapFactory.decodeStream(is);
      
    • 把图片设置为ImageView的显示内容

      ImageView iv = (ImageView) findViewById(R.id.iv);
      iv.setImageBitmap(bm);
      
    • 添加权限

    主线程不能被阻塞

    • 在Android中,主线程被阻塞会导致应用不能刷新ui界面,不能响应用户操作,用户体验将非常差
    • 主线程阻塞时间过长,系统会抛出ANR异常
    • ANR:Application Not Response;应用无响应
    • 任何耗时操作都不可以写在主线程
    • 因为网络交互属于耗时操作,如果网速很慢,代码会阻塞,所以网络交互的代码不能运行在主线程

    只有主线程能刷新ui

    • 刷新ui的代码只能运行在主线程,运行在子线程是没有任何效果的
    • 如果需要在子线程中刷新ui,使用消息队列机制

    消息队列

    • Looper一旦发现Message Queue中有消息,就会把消息取出,然后把消息扔给Handler对象,Handler会调用自己的handleMessage方法来处理这条消息
    • handleMessage方法运行在主线程
    • 主线程创建时,消息队列和轮询器对象就会被创建,但是消息处理器对象,需要使用时,自行创建

      //消息队列
      Handler handler = new Handler(){
          //主线程中有一个消息轮询器looper,不断检测消息队列中是否有新消息,如果发现有新消息,自动调用此方法,注意此方法是在主线程中运行的
          public void handleMessage(android.os.Message msg) {
      
          }
      };
      
    • 在子线程中往消息队列里发消息

      //创建消息对象
      Message msg = new Message();
      //消息的obj属性可以赋值任何对象,通过这个属性可以携带数据
      msg.obj = bm;
      //what属性相当于一个标签,用于区分出不同的消息,从而运行不能的代码
      msg.what = 1;
      //发送消息
      handler.sendMessage(msg);
      
    • 通过switch语句区分不同的消息

      public void handleMessage(android.os.Message msg) {
          switch (msg.what) {
          //如果是1,说明属于请求成功的消息
          case 1:
              ImageView iv = (ImageView) findViewById(R.id.iv);
              Bitmap bm = (Bitmap) msg.obj;
              iv.setImageBitmap(bm);
              break;
          case 2:
              Toast.makeText(MainActivity.this, "请求失败", 0).show();
              break;
          }       
      }
      

    加入缓存图片的功能

    • 把服务器返回的流里的数据读取出来,然后通过文件输入流写至本地文件

      //1.拿到服务器返回的输入流
      InputStream is = conn.getInputStream();
      //2.把流里的数据读取出来,并构造成图片
      
      FileOutputStream fos = new FileOutputStream(file);
      byte[] b = new byte[1024];
      int len = 0;
      while((len = is.read(b)) != -1){
          fos.write(b, 0, len);
      }
      
    • 创建bitmap对象的代码改成

      Bitmap bm = BitmapFactory.decodeFile(file.getAbsolutePath());
      
    • 每次发送请求前检测一下在缓存中是否存在同名图片,如果存在,则读取缓存

    获取开源代码的网站

    • code.google.com
    • github.com
    • 在github搜索smart-image-view
    • 下载开源项目smart-image-view
    • 使用自定义组件时,标签名字要写包名

      <com.loopj.android.image.SmartImageView/>
      
    • SmartImageView的使用

      SmartImageView siv = (SmartImageView) findViewById(R.id.siv);
      siv.setImageUrl("http://192.168.1.102:8080/dd.jpg");
      

    Html源文件查看器

    • 发送GET请求

      URL url = new URL(path);
      //获取连接对象
      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
      //设置连接属性
      conn.setRequestMethod("GET");
      conn.setConnectTimeout(5000);
      conn.setReadTimeout(5000);
      //建立连接,获取响应吗
      if(conn.getResponseCode() == 200){
      
      }
      
    • 获取服务器返回的流,从流中把html源码读取出来

      byte[] b = new byte[1024];
      int len = 0;
      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      while((len = is.read(b)) != -1){
          //把读到的字节先写入字节数组输出流中存起来
          bos.write(b, 0, len);
      }
      //把字节数组输出流中的内容转换成字符串
      //默认使用utf-8
      text = new String(bos.toByteArray());
      

    乱码的处理

    • 乱码的出现是因为服务器和客户端码表不一致导致

      //手动指定码表
      text = new String(bos.toByteArray(), "gb2312");
      

    提交数据

    GET方式提交数据

    • get方式提交的数据是直接拼接在url的末尾

      final String path = "http://192.168.1.104/Web/servlet/CheckLogin?name=" + name + "&pass=" + pass;
      
    • 发送get请求,代码和之前一样

      URL url = new URL(path);
      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
      conn.setRequestMethod("GET");
      conn.setReadTimeout(5000);
      conn.setConnectTimeout(5000);
      if(conn.getResponseCode() == 200){
      
      }
      
    • 浏览器在发送请求携带数据时会对数据进行URL编码,我们写代码时也需要为中文进行URL编码

      String path = "http://192.168.1.104/Web/servlet/CheckLogin?name=" + URLEncoder.encode(name) + "&pass=" + pass;
      

    POST方式提交数据

    • post提交数据是用流写给服务器的
    • 协议头中多了两个属性

      • Content-Type: application/x-www-form-urlencoded,描述提交的数据的mimetype
      • Content-Length: 32,描述提交的数据的长度

        //给请求头添加post多出来的两个属性
        String data = "name=" + URLEncoder.encode(name) + "&pass=" + pass;
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty("Content-Length", data.length() + "");
        
    • 设置允许打开post请求的流

      conn.setDoOutput(true);
      
    • 获取连接对象的输出流,往流里写要提交给服务器的数据

      OutputStream os = conn.getOutputStream();
      os.write(data.getBytes());

     

     

    展开全文
  • 网络加载图片的三种方法

    千次阅读 2014-10-13 19:46:48
    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482165
  • Android在ImageView上直接显示网络图片

    万次阅读 多人点赞 2017-08-16 18:33:19
    在原生的ImageView中,没有一个方法是可以直接显示网络的图片的,当我们经常需要显示网络图片时,每次都有一大堆的操作,这会很麻烦,今天就教大家在ImageView上轻松显示网络图片。 自定义ImageView方法 写一个类让...
  • 五种网络图片加载

    千次阅读 2018-12-06 10:14:46
    HttpURLConnection方式: public Bitmap getImageBitmap(String url) {  URL imgUrl = null;  Bitmap bitmap = null;  try {  imgUrl = new URL(url);  HttpURLConnection...
  • Android Volley完全解析(二),使用Volley加载网络图片

    万次阅读 多人点赞 2014-04-17 09:23:22
    在上一篇文章中,我们了解了Volley到底是什么,以及它的基本用法。本篇文章中我们即将学习关于Volley更加高级...我们都知道,Universal-Image-Loader具备非常强大的加载网络图片的功能,而使用Volley,我们也可以实现基
  • java通过url读取网络图片

    万次阅读 2019-04-08 18:06:22
    使用java.net读取网络文件 import java.io.BufferedInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; ...
  • 1.注意点: 在绘制网络图片时必需先将其保存到本地然后在绘制。当我们在加载一个带有图片的页面时,图片都会被暂存到本地,由此我们可以通过wx.gerImageInfo接口访问本地的暂存路径来调用drawImage方法绘制图片。...
  • GridView加载网络图片

    千次阅读 2015-06-15 15:23:03
    GridView加载本地图片可以直接用Drawable获取图片资源,但是如果想要加载网络图片的话,就得用异步任务,获取图片资源,然后再加载到GridView中。 首先先写一个类,声明Item里面的内容控件,这
  • IOS网络图片缓存详解

    万次阅读 2013-08-19 22:00:01
    比如某个应用要经常显示网络图片,就不能每次显示图片都去网络上下载,那太耗费时间也太耗费流量,这时就要对网络图片进行缓存了,以下是我对IOS网络图片缓存的一些见解,有不足之处,欢迎大家指出来,一起探讨。...
  • 1.获取远程网路的图片 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 /** * 根据地址获得数据的...
  • pages/index/index.wxss 中的本地资源图片无法通过 WXSS 获取,可以使用网络图片,或者 base64,或者使用&amp;lt;image/&amp;gt;标签。 报错位置 background-image: .user-container { display: flex; ...
  • 很多包含网络图片查看功能的应用中,都实现了保存网络图片到本地的功能。在查看大图时,可以通过长按或按钮来保存图片。 本文描述将一个Bitmap对象保存为一个图片文件的主要步骤。保存的图片文件能够立刻在系统相册...
  • Qt 之显示网络图片

    万次阅读 热门讨论 2016-03-01 16:07:03
    简述Qt中包含了网络模块-network,我们可以很容易的进行各种网络编程和数据传输,关于...下面我们先看一个简单地示例:Qt显示一个网络图片。简述 效果 源码 处理方式效果源码创建按钮及显示图像的标签,连接信号槽。
  • 项目使用 Picasso的时候发现一些问题,列表大量快速滑动的时候容易内存过高而崩溃。快速滑动有卡顿。仔细看了下源码。发现Picasso的解析是没有做...于是自己写了一个支持内存缓存和本地文件缓存的网络图片加载框架
  • Android获取网络图片的三种方法

    千次阅读 2016-05-06 21:23:33
    Android获取网络图片 AsynTask异步获取
  • Android异步加载网络图片

    万次阅读 多人点赞 2012-04-17 16:30:17
    加载图片时先查看缓存中时候存在该图片,如果存在则返回该图片,否则先加载载一个默认的占位图片,同时创建一个通过网络获取图片的任务并添加,任务完成后放松消息给主线程更新界面。 使用方法: AsynImageLoader ...
  • C#显示网络图片

    千次阅读 2012-11-23 16:26:54
    /* * 版 本: Ver 1.0. * 类 名: NetForm. ... * 作 者: xyw. * 日 期: 2012年11月23. * 描 述: 网络图片查看. */ using System; using System.Collections.Generic; using System.ComponentMode
1 2 3 4 5 ... 20
收藏数 651,201
精华内容 260,480
关键字:

网络图片