一个简单的图片浏览

news/2024/10/17 18:28:50/

1、图源API
在问度娘之后发现了几个可用的API,主要来自下面几个博主的分享
在线随机美图API接口服务
可以获取随机图片的API收集
随机图片API接口
最终自己测试使用的是下面三个网址:
https://uploadbeta.com/api/pictures/random //必应推荐
https://img.xjh.me/random_img.php //二次元
url返回text/html文本需要进行解析,python处理文本内容示例,获取img的src

import requests
import json
import redef find_img_src(html):replace_pattern = r'<[img|IMG].*?/>' #img标签的正则式img_url_pattern = r'.+?src="(\S+)"' #img_url的正则式replaced_img_url_list = []img_url_list = []need_replace_list = re.findall(replace_pattern, html)#找到所有的img标签for tag in need_replace_list:img_url_list.append(re.findall(img_url_pattern, tag)[0])#找到所有的img_urlreturn img_url_listheaders = {"User-Agent": "Mozilla/5.0"}  
#"Content-Type": "text/html" ,这个返回的是text
#text中含有图片地址的src标签
# response = requests.get("https://cdn.mom1.cn/?mom=306",headers = headers)#"Content-Type": "text/html" ,这个返回的是text
#text中含有图片地址的src标签
response = requests.get("https://img.xjh.me/random_img.php")
print(response.text)
url_list = find_img_src(response.text)    #返回url列表#"Content-Type": "image/jpeg"  或者网站直接返回的是图片
# response = requests.get("https://uploadbeta.com/api/pictures/random",headers = headers)
for i in url_list:response = requests.get("https:"+i, headers=headers)print(response.status_code)if response.status_code == 200:if (response.headers!=None):print(json.dumps(dict(response.headers),indent=1))  #indent缩排,使得换行显示if (response.content!=None):# print(response.text)open(r'C:\Users\******\Desktop\erci.png','wb').write(response.content)  # 将内容写入图片print("done")

java从文本中解析出图片的url示例,参考Java获取img标签里的src路径

public  List<String>getImgSrc(String content){     List<String>list=new ArrayList<String>();Pattern p_img=Pattern.compile("<(img|IMG)(.*?)(/>|></img>|>)");Matcher m_img=p_img.matcher(content);   //matcher方法返回对象boolean result_img=m_img.find();if(result_img){while(result_img){String str_img=m_img.group(2);   //捕获组Pattern p_src=Pattern.compile("(src|SRC)=(\"|\')(.*?)(\"|\')");Matcher m_src=p_src.matcher(str_img);if(m_src.find()){String str_src=m_src.group(3);list.add(str_src);}//结束匹配<img/>标签中的src//匹配content中是否存在下一个<img/>标签,有则继续以上步骤匹配<img/>标签中的srcresult_img=m_img.find();}}return list;}

https://cdn.mom1.cn/img/mom2018%20(666).jpg //妹子大图

2、JAVA获取图片
使用okhttp包,建立http连接,得到输入流,再进行解码,关于图片的解析与处理,参考Bitmap的inJustDecodeBounds属性,下面是代码示例

    class Network_http_optimize {OkHttpClient myokHttpClient = new OkHttpClient().newBuilder()
//                .connectTimeout(5, TimeUnit.SECONDS)    //设置连接超时   
//                .readTimeout(5,TimeUnit.SECONDS).build();//创建get请求函数public InputStream getInputStream(String url) throws IOException {Request request = new Request.Builder().url(url).get().build();Response response = myokHttpClient.newCall(request).execute();return response.body().byteStream();}//创建get请求函数public String getString(String url) throws IOException {Request request = new Request.Builder().url(url).get().build();Response response = myokHttpClient.newCall(request).execute();return response.body().string();}}public class Network_http extends Thread {String im_group_url = null;InputStream inputStream = null;String result_json_data = null;JSONArray data_array = null;int category ;Message msg = new Message();Bitmap bitmap = null;@Overridepublic void run() {Network_http_optimize network_http_optimize = new Network_http_optimize();category = (int)(Math.random()*10)%3;    switch(category) {case 0:String im_url = "https://cdn.mom1.cn/img/mom2018%20("+(int)(Math.random()*1000)+").jpg";   bitmap = Get_img_and_scale(im_url);if (bitmap==null){System.out.println("未获取到图片->美女");}msg.what = 1;msg.obj = new Image_object(im_url,bitmap);my_handler.sendMessage(msg);   //每一张图片我就发送一个消息break;case 1:String im_url_1 = "https://uploadbeta.com/api/pictures/random";Bitmap bitmap = Get_img_and_scale(im_url_1);    if (bitmap==null){System.out.println("未获取到图片->必应");}msg.what = 1;msg.obj = new Image_object(im_url_1,bitmap);my_handler.sendMessage(msg);   //每一张图片我就发送一个消息break;case 2://这种返回的是text文本,包含img的src标签,通过正则表达式,可以获取图片正真的网络地址String im_url_2 = "https://img.xjh.me/random_img.php";     //二次元图片APItry {String text = network_http_optimize.getString(im_url_2);List src_list = getImgSrc(text);   //成功得到src资源im_url_2 = "https:"+src_list.get(0).toString();    //得到真实的urlbitmap = Get_img_and_scale(im_url_2);  if (bitmap==null){System.out.println("未获取到图片->二次元");}msg.what = 1;msg.obj = new Image_object(im_url_2,bitmap);my_handler.sendMessage(msg);   //每一张图片我就发送一个消息} catch (IOException e) {e.printStackTrace();}break;default:break;}}public Bitmap Get_img_and_scale(String url) {Network_http_optimize network_http_optimize = new Network_http_optimize();Bitmap bitmap = null;try {InputStream inputStream = network_http_optimize.getInputStream(url);BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;//不返回实际的bitmap,但可以通过这个bitmap获取图片的宽和高bitmap = BitmapFactory.decodeStream(inputStream, null,options);float realWidth = options.outWidth;float realHeight = options.outHeight;System.out.print("真实图片高度:" + realHeight + "   宽度:" + realWidth+"    ");int scale = (int) ((realHeight > realWidth ? realHeight : realWidth) / 1000);  if (scale <= 0) { scale = 1; }System.out.println("缩放scale:"+scale);inputStream.close();options.inSampleSize = scale;options.inJustDecodeBounds = false;//注意这次要把options.inJustDecodeBounds 设为 false,这次图片是要读取出来的inputStream = network_http_optimize.getInputStream(url);    //重新载入,读取数据流的bitmap = BitmapFactory.decodeStream(inputStream,null,options);inputStream.close();} catch (IOException e) {e.printStackTrace();System.out.println("请求出现错误");}return bitmap;}public  List<String>getImgSrc(String content){    List<String>list=new ArrayList<String>();Pattern p_img=Pattern.compile("<(img|IMG)(.*?)(/>|></img>|>)");Matcher m_img=p_img.matcher(content);   //matcher方法返回对象boolean result_img=m_img.find();if(result_img){while(result_img){String str_img=m_img.group(2);Pattern p_src=Pattern.compile("(src|SRC)=(\"|\')(.*?)(\"|\')");Matcher m_src=p_src.matcher(str_img);if(m_src.find()){String str_src=m_src.group(3);list.add(str_src);}//结束匹配<img/>标签中的src//匹配content中是否存在下一个<img/>标签,有则继续以上步骤匹配<img/>标签中的srcresult_img=m_img.find();}}return list;}}

3、显示到ListVIEW
继承adapter,建立图片对象,加载自己的布局文件,实现图片显示

    public class Image_object {String im_description;Bitmap im_self;int im_drawable_id;public Image_object(String im_discription,Bitmap im_self){this.im_description = im_discription;this.im_self = im_self;}public Image_object(String im_discription,int im_drawable_id){this.im_description = im_discription;this.im_drawable_id = im_drawable_id;}public String getIm_description(){return im_description;}public Bitmap getIm_self(){return im_self;}public int getIm_drawable_id(){return im_drawable_id;}}public class UserListAdapter extends ArrayAdapter {private int resourceId;public UserListAdapter(Context context, int textViewResourceId, List objects) {super(context, textViewResourceId, objects);resourceId = textViewResourceId;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {Image_object image_object = (Image_object) getItem(position); View view;if(convertView==null){	view= LayoutInflater.from(getContext()).inflate(resourceId,parent,false);}else {view=convertView;}TextView imagedescription = view.findViewById(R.id.image_discription);ImageView imageself = view.findViewById(R.id.image_self);imagedescription.setText(image_object.getIm_description());imageself.setImageBitmap(image_object.getIm_self());return view;}}

4、实现图片的点击放大与保(dialog方法)
继承dialog,添加初始化的方法,在onCreate当中设置点击与长按的监听事件,点击图片将使得dialog取消,长按将进入保存设置。方法参考点击图像显示大图Dialog,保存图片可以详细看下这篇文章Android中保存图片到本地功能实现,下面是代码示例

package com.example.pbrowser;import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;import androidx.annotation.NonNull;public class Photo_zoom_dialog extends Dialog {public Photo_zoom_dialog(@NonNull Context context) {super(context);   //需要构造方法}public Photo_zoom_dialog setBitmap(Bitmap bitmap){    //方法this.bitmap = bitmap;return this;}ImageView imageView;Bitmap bitmap;AlertDialog alertDialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.z_zoom_photo);//按空白处能取消动画setCanceledOnTouchOutside(true);imageView = findViewById(R.id.my_picture);Point point = new Point();getWindow().getWindowManager().getDefaultDisplay().getSize(point);if (bitmap != null){imageView.setImageBitmap(bitmap);  Window win = getWindow();    //设置显示图片区域大小WindowManager.LayoutParams lp = win.getAttributes();lp.gravity = Gravity.CENTER;//如果宽度小于point.x,会按原尺寸显示,大于就屏宽显示lp.height = WindowManager.LayoutParams.WRAP_CONTENT;  //高度设置成自适应lp.width = point.x;    //这个跟手机有关系,我的HD+为720,FHD+为1080win.setAttributes(lp);getWindow().setBackgroundDrawableResource(android.R.color.transparent);  //去点dialog的白边}imageView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Photo_zoom_dialog.super.dismiss();   //调用对象自己dismiss()方法}});imageView.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {alertDialog = new AlertDialog.Builder(getContext()).setMessage("保存图片").setPositiveButton("确定", new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which) {}}).setNegativeButton("取消",null).create();alertDialog.show();return false;}});}
}

调用就非常简单,点击ListVIEW的item,创建dialog对象,实现图片显示,代码示例

        myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {Image_object image_object = (Image_object) display_image_list.get(position);Photo_zoom_dialog photo_zoom_dialog = new Photo_zoom_dialog(getContext());photo_zoom_dialog.setBitmap(image_object.getIm_self());photo_zoom_dialog.show();}});

http://www.ppmy.cn/news/150196.html

相关文章

ImageView组件的应用:图片浏览器

随时随地阅读更多技术实战干货&#xff0c;获取项目源码、学习资料&#xff0c;请关注源代码社区公众号(ydmsq666) 本实例用来练习ImageView组件的使用&#xff0c;实现一个图片浏览器&#xff0c;该图片浏览器可以改变所查看的图片的透明度&#xff0c;切换图片&#xff0c;而…

鲁大师2022年Q1季报公布,九号获得最智能电动车品牌

近日&#xff0c;鲁大师2022年Q1季报发布了智能电动车品牌排行榜&#xff0c;其中&#xff0c;备受瞩目的九号电动车品牌以627分的绝对优势夺得鲁大师2022年Q1季度最智能电动车品牌。 据专业人士了解&#xff0c;鲁大师智慧实验室的目标是建立以硬件产品数据采集为主要内容的数…

高德API JS 高德地图获取多个坐标点的中心点

高德API JS 高德地图获取多个坐标点的中心点 一、需求 我需要在地图上展示多个地点&#xff0c;并且展示的同时&#xff0c;地图缩放到合适的大小&#xff0c;要求刚好能显示全部点位&#xff0c;并且边缘留有一部分间隔。 做成如图所示这样。 二、需要用到的 AMap 类库 经…

鲁大师电动车智能化测评报告第九期

鲁大师第九期智能化电动车测评排行榜数据来源于鲁大师智慧实验室&#xff0c;测评的车型均为市面上主流品牌的主流车型&#xff0c;截止目前&#xff0c;鲁大师智能化电动车测评的车型高达40余种&#xff0c;且还在不断增加和丰富中。 一 测评依据 鲁大师电动车智能化测评体系包…

LNMP搭建过程详解,验证搭建论坛

LNMP搭建过程详解&#xff0c;验证搭建论坛 一、安装Nginx服务1、安装依赖包2、创建运行用户3、编译安装4、优化路径5、添加Nginx 系统服务 二、安装MySQL服务1、安装Mysql环境依赖包2、创建运行用户3、编译安装4、修改mysql配置文件5、更改mysql安装目录和配置文件的属主属组6…

服务运营 |摘要: Healthcare Management Science 近期论文汇总

推文作者&#xff1a;李舒湉 罗毓灵 编者按 Healthcare Management Science 近期论文汇总 Healthcare Management Science 论文精选&#xff08;三月下&#xff09; 1Monitoring policy in the context of preventive treatment of cardiovascular disease https://link.sprin…

液晶面板价格暴跌,电视便宜到笑,千元手机价格可买大屏电视

很久没关注电视了&#xff0c;最近一看电视的报价&#xff0c;发现电视价格已经低得让人发指&#xff0c;70英寸的液晶电视价格已低至1799元&#xff0c;比一部性能稍好一些的手机还要便宜&#xff0c;可见电视多么便宜。 售价1799元的70英寸液晶电视是大品牌的智能电视&#x…

全球液晶电视用导光板收入预计2028年达到12.037亿美元

液晶电视导光板是利用光学级的压克力/PC板材&#xff0c;然后用具有极高反射率且不吸光的高科技材料&#xff0c;在光学级的压克力板材底面用UV网版印刷技术印上导光点。 图液晶电视导光板 内容摘要 本报告针对未来几年液晶电视用导光板的发展前景预测&#xff0c;本文预测到…