精华内容
下载资源
问答
  • 长按图片识别图中二维码: 1 // 长按图片识别二维码 2 3 UILongPressGestureRecognizer *QrCodeTap = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(QrCodeClick:)]; 4 ...

     

     长按图片识别图中二维码:

      1 // 长按图片识别二维码 
      2 
      3     UILongPressGestureRecognizer *QrCodeTap = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(QrCodeClick:)];
      4 
      5     [self.view addGestureRecognizer:QrCodeTap];
      6 
      7  
      8 
      9 - (void)QrCodeClick:(UILongPressGestureRecognizer *)pressSender {
     10 
     11     
     12 
     13     if (pressSender.state != UIGestureRecognizerStateBegan) {
     14 
     15         return;//长按手势只会响应一次
     16 
     17     }
     18 
     19     
     20 
     21 //    MJPhoto *photo = _photos[_currentPhotoIndex];
     22 
     23     //截图 再读取
     24 
     25  
     26 
     27     //第一个参数表示区域大小。第二个参数表示是否是非透明的。如果需要显示半透明效果,需要传NO,否则传YES。第三个参数就是屏幕密度了,获取当前屏幕分辨率[UIScreen mainScreen].scale
     28 
     29     UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, YES, 2.2);
     30 
     31     
     32 
     33     CGContextRef context = UIGraphicsGetCurrentContext();
     34 
     35     
     36 
     37     [self.view.layer renderInContext:context];
     38 
     39     
     40 
     41     UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
     42 
     43     UIGraphicsEndImageContext();
     44 
     45     
     46 
     47     CIImage *ciImage = [[CIImage alloc] initWithCGImage:image.CGImage options:nil];
     48 
     49     CIContext *ciContext = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer : @(YES)}]; // 软件渲染
     50 
     51     CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:ciContext options:@{CIDetectorAccuracy : CIDetectorAccuracyHigh}];// 二维码识别
     52 
     53     
     54 
     55     NSArray *features = [detector featuresInImage:ciImage];
     56 
     57     
     58 
     59     if (features.count) {
     60 
     61         
     62 
     63         for (CIQRCodeFeature *feature in features) {
     64 
     65             NSLog(@"qrCodeUrl = %@",feature.messageString); // 打印二维码中的信息
     66 
     67             qrCodeUrl = feature.messageString;
     68 
     69         }
     70 
     71         
     72 
     73         // 初始化弹框 第一个参数是设置距离底部的边距
     74 
     75         alertview = [[RomAlertView alloc] initWithMainAlertViewBottomInset:0 Title:nil detailText:nil cancelTitle:nil otherTitles:[NSMutableArray arrayWithObjects:@"保存图片",@"识别图中二维码",nil]];
     76 
     77         alertview.tag = 10002;
     78 
     79         // 设置弹框的样式
     80 
     81         alertview.RomMode = RomAlertViewModeBottomTableView;
     82 
     83         // 设置弹框从什么位置进入 当然也可以设置什么位置退出
     84 
     85         [alertview setEnterMode:RomAlertEnterModeBottom];
     86 
     87         // 设置代理
     88 
     89         [alertview setDelegate:self];
     90 
     91         // 显示 必须调用 和系统一样
     92 
     93         [alertview show];
     94 
     95     } else {
     96 
     97         NSLog(@"图片中没有二维码");
     98 
     99     }
    100 
    101  
    102 
    103 }
    104 
    105  
    106 
    107 #pragma mark -- RomAlertViewDelegate 弹框识别图中二维码
    108 
    109 - (void)alertview:(RomAlertView *)alertview didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    110 
    111 {
    112 
    113     if (alertview.tag == 10002) {
    114 
    115         if ([alertview.otherTitles[indexPath.row]  isEqualToString:@"保存图片"]) {
    116 
    117             NSLog(@"保存图片");
    118 
    119             [self saveButtonPressed];
    120 
    121         }else if ([alertview.otherTitles[indexPath.row] isEqualToString:@"识别图中二维码"]){
    122 
    123             NSLog(@"识别图中二维码");
    124 
    125  
    126 
    127             // 隐藏
    128 
    129             [alertview hide];
    130 
    131             [self leftBackButtonPressed];
    132 
    133             
    134 
    135             AppDelegate *delegate=(AppDelegate *)[[UIApplication sharedApplication]delegate];
    136 
    137             if([delegate.window.rootViewController isKindOfClass:[UITabBarController class]]){
    138 
    139                 UITabBarController *tabBarController = (UITabBarController *)delegate.window.rootViewController;
    140 
    141                 UINavigationController *navigationController = [tabBarController selectedViewController];
    142 
    143                 UIViewController *vc = navigationController.topViewController;
    144 
    145                 //对结果进行处理跳转网页
    146 
    147                 ADWebViewViewController *controller = [[ADWebViewViewController alloc] init];
    148 
    149                 controller.m_url = qrCodeUrl;
    150 
    151                 controller.hidesBottomBarWhenPushed = YES;
    152 
    153                 [vc.navigationController pushViewController:controller animated:YES];
    154 
    155             }
    156 
    157         }
    158 
    159     }
    160 
    161 }

     

    转载于:https://www.cnblogs.com/gongyuhonglou/p/8777847.html

    展开全文
  • iOS 长按识别 图片中二维码 zbar pincode
  • 下面这个图片就是通过图片和文字...图片利用wx.previewImage进行展示,才能识别图片中的微信小程序二维码,这是博主目前知道唯一一种识别二维码的手段。 1.合成canvas wxml: <canvas canvas-id="myc...

    下面这个图片就是通过图片和文字等内容合成的一张带有微信小程序二维码的图片,在小程序内部长按可以识别出来:
    这里写图片描述

    基本思路是先将内容用canvas排好版,然后把该canvas转化成图片;图片利用wx.previewImage进行展示,才能识别图片中的微信小程序二维码,这是博主目前知道唯一一种识别二维码的手段。

    1.合成canvas
    wxml:

    <canvas canvas-id="mycanvas" class='canvas' id="mycanvas" wx:if="{{isShowCav}}" style='border:1px solid #000000'/>

    wxss

    .canvas{
      position: absolute;
      top: 0;
      left: 0;
      z-index: 2000;
      width: 748rpx;
      height: 1336rpx;
    }

    js

      canvas:function(object){
        let _this = this;
        let realWidth, realHeight;
        //创建节点选择器
        var query = wx.createSelectorQuery();
        //选择id
        query.select('#mycanvas').boundingClientRect()
        query.exec(function (res) {
          //res就是 该元素的信息 数组
          realWidth = res[0].width;
          realHeight = res[0].height;
          console.log('realHeight', realHeight);
          console.log('realWidth', realWidth);
          const ctx = wx.createCanvasContext('mycanvas');
          ctx.drawImage("../../images/ctx-bg.jpg", 0, 0, realWidth, realHeight);
          ctx.drawImage(_this.data.canvasUserPic, (realWidth * 0.099), (realHeight * 0.052), (realWidth * 0.091), (realWidth * 0.091));
          ctx.setFontSize(12);
          ctx.setFillStyle("#a38874");
          ctx.fillText(object.date, (realWidth * 0.201), (realHeight * 0.076));
          ctx.setFontSize(14);
          ctx.setFillStyle("#a38874");
          ctx.fillText("农历" + object.lunar, (realWidth * 0.201), (realHeight * 0.099));
          ctx.drawImage("../../images/swiper-bg.png", (realWidth * 0.099), (realHeight * 0.112), (realWidth * 0.8), (realHeight * 0.60));
          ctx.drawImage(_this.data.canvasShowImg, (realWidth * 0.099), (realHeight * 0.112), (realWidth * 0.8), (realHeight * 0.30));
          ctx.drawImage("../../images/swiper-detail.png", (realWidth * 0.099), (realHeight * 0.395), (realWidth * 0.8), (realHeight * 0.03));
          ctx.setFontSize(16);
          ctx.setFillStyle("#8d7665");
    
          ctx.setTextAlign('center')
          ctx.fillText(object.title1, realWidth/2, _this.calculateWH(2, 620, realWidth, realHeight));
          ctx.fillText(object.title2, realWidth / 2, _this.calculateWH(2, 666, realWidth, realHeight));
    
          ctx.drawImage("../../images/swiper-line.png", (realWidth - realWidth * 0.71)/2, (realHeight * 0.528), (realWidth * 0.71), (realHeight * 0.0195));
          ctx.drawImage("../../images/luckpic.png", _this.calculateWH(1, 267, realWidth, realHeight), _this.calculateWH(2, 763, realWidth, realHeight), _this.calculateWH(1, 204, realWidth, realHeight), _this.calculateWH(2, 60, realWidth, realHeight));
          ctx.setFontSize(12);
          ctx.fillText(object.luck_title, realWidth / 2, _this.calculateWH(2, 880, realWidth, realHeight));
          ctx.drawImage("../../images/code.jpg", _this.calculateWH(1, 229, realWidth, realHeight), _this.calculateWH(2, 989, realWidth, realHeight), _this.calculateWH(1, 292, realWidth, realHeight), _this.calculateWH(1, 292, realWidth, realHeight))
          ctx.draw();
    
          setTimeout(function () {
            wx.canvasToTempFilePath({
              canvasId: 'mycanvas',
              success: function (res) {
                var tempFilePath = res.tempFilePath;
                _this.setData({
                  canvasUrl: tempFilePath
                })
                if (tempFilePath !== '') {
                  _this.setData({
                    isShowCav: false
                  });
                  wx.hideLoading();
                  wx.previewImage({
                    current: _this.data.canvasUrl, // 当前显示图片的http链接  
                    urls: [_this.data.canvasUrl], // 需要预览的图片http链接列表  
                  })
                }
              },
              fail: function (res) {
                console.log(res);
              }
            });
          }, 500);
        })
      },

    出现问题:
    1.服务器上发送过来的图片路径直接插进ctx.drawImage 上,手机上显示不了。
    解决方案:利用wx.downloadFile 将图片下载再保存好这个新图片路径,然后放到ctx.drawImage

     //下载图片
      onShow1: function (object) {
        let _this = this;
        _this.setData({
          isShowCav: true
        })
        wx.downloadFile({
          url: object.avatarurl,
          success: function (sres) {
            _this.setData({
              canvasUserPic: sres.tempFilePath
            });
            wx.downloadFile({
              url: object.show_img,
              success: function (sres1) {
                _this.setData({
                  canvasShowImg: sres1.tempFilePath
                });
                _this.canvas(object);
              }
            })
          }
        })
      },  

    2.canvas出现在手机上的顶层,不管z-index设置多少层都没有用。
    解决方案:利用wx:if="{{isShowCav}}" 将canvas临时隐藏,要用到的时候再显示。不用再隐藏掉。

    3.canvas里面的文字如何居中,官方文档虽然提供了案例,但是没有说具体是怎么用的。
    解决方案:

    const ctx = wx.createCanvasContext('myCanvas')
    
    ctx.setStrokeStyle('red')
    ctx.moveTo(150, 20)
    ctx.lineTo(150, 170)
    ctx.stroke()
    
    ctx.setFontSize(15)
    ctx.setTextAlign('left')
    ctx.fillText('textAlign=left', 150, 60)
    
    ctx.setTextAlign('center')
    ctx.fillText('textAlign=center', 150, 80)
    
    ctx.setTextAlign('right')
    ctx.fillText('textAlign=right', 150, 100)
    
    ctx.draw()

    这里写图片描述

    这里面的居中不是我们常用的css那种居中;而是忽略了文字宽高的意思,所以你还是要给文字设置一个(x,y)坐标,只要将这个坐标写上canvas宽度的一半,它就可以实现居中了。

    小程序的坑还是不好踩啊,一肛上半天时间就没了!

    展开全文
  • 一、目前微信官方支持小程序原生页面在微信版本IOS≥8.0.6,安卓≥8.0.3时直接长按识别...二、小程序原生页面,在微信版本IOS≥8.0.6,安卓≥8.0.3时支持通过点击放大图片,然后长按识别二维码,实现跳转功能: WXML

    【一】、image标签展示二维码
    目前微信官方支持小程序原生页面在微信版本IOS≥8.0.6,安卓≥8.0.3时直接长按识别二维码,

    <image src="二维码图片地址" show-menu-by-longpress="true"></image>
    

    !!注:show-menu-by-longpress=“true” 这个属性一定要加上,否则长按不会有反应

    但是,这样识别的目前不支持跳转到对应页面(如添加好友),官方也证实这是当前版本的 bug ,并承诺会在下一个版本里面修复;也许你看到这篇文章的时候这个 bug 已经修好了。

    【二】、preview-使用的小程序 api
    小程序原生页面中,在微信版本IOS≥8.0.6,安卓≥8.0.3时支持通过点击放大图片,然后长按识别二维码,实现跳转功能:
    WXML

    <image src="二维码图片地址" bindtap="clickImg"/>
    

    JS

    clickImg(){
    wx.previewImage({
      urls: ['二维码图片地址']
    })
    }
    

    支持识别以下二维码:

    ✅ 识别小程序码 - ✅ 跳转小程序
    ✅ 识别微信、企微群二维码 - ✅ 跳转到加群页面
    ✅ 识别名片二维码 - ✅ 跳转到加好友页面
    ❌公众号二维码
    

    【三】、webview 中嵌入二维码
    支持将企微或者个微的二维码放在公众号推文里,长按推文里的二维码识别跳转

    1、将企业微信的二维码放置在一篇公众号图文中
    2、将这个公众号和小程序关联(!!注:必须关联起来,否则小程序的 webview 无法打开推文。这个关联操作在公众号后台即可操作)
    3、在小程序的webview页面里打开这篇公众号图文,并长按企业微信二维码进行识别

    ✅ 识别小程序码 - ✅ 跳转小程序
    ✅ 识别微信、企微群二维码 - ✅ 跳转到加群页面
    ✅ 识别名片二维码 - ✅ 跳转到加好友页面
    ✅ 公众号二维码-✅ 跳转到关注公众号页面
    

    但是【三】在IOS受微信版本号限制,安卓机不受微信版本号限制…

    IOS-8.0.6版本 👇👇👇
    IOS-8.0.6版本

    IOS-8.0.5 👇👇👇
    IOS-8.0.5

    IOS-7.0.9 👇👇👇
    IOS-7.0.9

    安卓-7.0.20👇👇👇
    安卓-7.0.20

    【四】、客服会话
    1、引导用户点击进入客服会话;
    2、用户发送关键话术至客服会话;
    3、客户会话发送二维码,用户长按识别进行操作

    除了以上几种形式,还有其他什么方式,是不受微信版本号限制,可以实现小程序中长按图片识别图中二维码并跳转到对应页面的方式吗?

    展开全文
  • 同时识别图片是否是二维码,如果是则在弹框追加识别二维码功能。 细节上:保存图片的弹框要显示在手指长按的位置;选择图片保存后,可以让用户直接去相册查看;选择识别二维码,判断是是不是网址,是的话可以让...

    先来简单说一下本文所要实现的功能:用户在浏览网页的时候,长按某一区域,识别如果是图片,则弹出弹框,出现保存图片的功能。同时识别图片是否是二维码,如果是则在弹框中追加识别二维码功能。

    细节上:保存图片的弹框要显示在手指长按的位置;选择图片保存后,可以让用户直接去相册查看;选择识别二维码,判断是是不是网址,是的话可以让用户选择复制或访问,否则可以让用户选择复制或搜索。

    然后再来看一下效果图:

    保存图片

    识别包含普通文字的二维码:

    识别包含网址的二维码:

    上述功能所用到的类和库:

    • 获得长按内容:WebView.HitTestResult
    • 弹框列表:DialogFragment
    • 图片下载:Glide
    • 二维码识别:Zxing

    实现要点

    记录长按位置

    继承WebView记录触摸位置:

      @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
            touchX = (int) event.getRawX();
            touchY = (int) event.getRawY();
            return super.onInterceptTouchEvent(event);
        }
    复制代码

    弹框我选择DialogFragment而不是poupwindow的原因是poupwindow的显示通常需要依托另一个View,而且在7.0以上有兼容问题。 判断长按位置的内容类型是否是图片:

    获取图片信息

         setOnLongClickListener(new View.OnLongClickListener() {
    
                public boolean onLongClick(View v) {
                    WebView.HitTestResult result = getHitTestResult();
                    if (null == result)
                        return false;
                    int type = result.getType();
                    switch (type) {
                        case WebView.HitTestResult.EDIT_TEXT_TYPE: // 选中的文字类型
                            break;
                        case WebView.HitTestResult.PHONE_TYPE: // 处理拨号
                            break;
                        case WebView.HitTestResult.EMAIL_TYPE: // 处理Email
                            break;
                        case WebView.HitTestResult.GEO_TYPE: // &emsp;地图类型
                            break;
                        case WebView.HitTestResult.SRC_ANCHOR_TYPE: // 超链接
                            break;
                        case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE: // 带有链接的图片类型
                        case WebView.HitTestResult.IMAGE_TYPE: // 处理长按图片的菜单项
                            String url = result.getExtra();
                            if (mOnSelectItemListener != null && url != null && URLUtil.isValidUrl(url)) {
                                mOnSelectItemListener.onSelected(touchX, touchY, result.getType(), url);
                            }
                            return true;
                        case WebView.HitTestResult.UNKNOWN_TYPE: //未知
                            break;
                    }
                    return false;
                }
            });
    复制代码

    在手指长按位置处弹出弹框

    HitTestResult是一个实体类,只记录两个信息:当选选择内容的类型和内容的具体值。可以看到通过WebView.HitTestResult,我们可以获得除了图片外的很多内容类型。当然这里我们只需要判断是否是图片就好了,然后将长按位置和url一起回调给外层。在手指长按处显示弹框,主要就是DialogFragment显示位置的设定了:

     public void onStart() {
            super.onStart();
            Dialog dialog = getDialog();
            if (dialog != null) {
                Window window = dialog.getWindow();
                if (window != null) {
                    WindowManager.LayoutParams lp = window.getAttributes();
                    window.setGravity(Gravity.LEFT | Gravity.TOP);
                    lp.x = LocationX;//横坐标位置
                    lp.y = LocationY;//纵坐标位置
                    lp.width = UIHelper.dip2px(100);
                    lp.dimAmount = 0.0f;//外层背景透明,默认变暗
                    lp.width = ViewGroup.LayoutParams.WRAP_CONTENT;
                    lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
                    window.setAttributes(lp);
                    window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//内部背景透明
                }
            }
        }
    复制代码

    保存到相册

    利用Glide下载图片,Glide自带预加载和图片缓存功能,不需要每次都从网络中下载:

    GlideApp.with(appContext).asFile().load(url).submit().get();
    复制代码

    可以在长按识别出图片的时候就行预加载:

     GlideApp.with(appContext).asBitmap().load(url).preload();
    复制代码

    将图片保存在相册:

     public static void displayToGallery(Context context, File photoFile) {
            if (photoFile == null || !photoFile.exists()) {
                return;
            }
            String photoPath = photoFile.getAbsolutePath();
            String photoName = photoFile.getName();
            // 把文件插入到系统图库
            try {
                ContentResolver contentResolver = context.getContentResolver();
                MediaStore.Images.Media.insertImage(contentResolver, photoPath, photoName, null);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            // 最后通知图库更新
            context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + photoPath)));
        }
    复制代码

    识别图片中的二维码

    显示弹框的同时还要判断图片是否包含二维码,这部分就是Zxing自带的功能,所以代码就不贴了。注意不应该等是Zxing判断是不是二维码后再显示弹框,因为这部分操作耗时可能比较长(见图二)。应当在识别二维码内容后再去更新弹框列表的内容。

    总结

    总体来说这个功能实现注意的地方还是挺多的,好在都不复杂。当然本例还存在待优化的地方,以及实现更高级的功能,比如以图搜图,查看大图功能,也可以利用WebView.HitTestResult对获取到其他类型的内容进行处理,限于篇幅就不再展开了。 最后贴下本项目Github地址,对WebView感兴趣的可以了解下:

    Github

    展开全文
  • 1.小程序图片不能识别除小程序码以外的二维码 2.并且仅在 wx.previewImage 支持长按识别 官方文档(wx.previewImage组件) html代码(这里我就简单的添加了一张图片做测试) &lt;image src="/image...
  • 识别图片中二维码,基于zbar, 代码采用storyboard cocopod
  • 小程序: 长按识别图中二维码

    千次阅读 2019-10-14 20:13:57
    在小程序项目中,有时候我们需要按住二维码,弹出: 识别图中二维码的功能 1. API 小程序文档 — API — 媒体 — 图片 — perviewImage( ) : 在新页面中全屏预览图...
  • 用ionic框架开发微信h5页面,长按图片二维码不会弹出“识别图中二维码”,而且只有安卓系统有此问题,ios没问题,请问这是怎么回事?
  • Android 长按识别图中二维码 zxing

    千次阅读 2017-05-26 16:02:00
    #基于 Zxing, 初学Android 代码...//长按,通过zxing读取图片,判断是否有二维码 bigImage.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View viewm) { Bit
  • 1.首先要是img元素,如果是用background 作为背景的div是不行的。 2.图片中二维码要足够大,尺寸小了,不识别
  • 此DEMO 实现了夜间模式的切换,网页端要调取手机上传图片功能,自定义switchbutton ,长按图片识别是否是二维码 分别可以保存,以及使用系统自带的分享功能 由于app嵌套了网页 并且要实现夜间模式 ,当然如果...
  • 实现长按识别webview二维码

    千次阅读 2017-08-07 09:05:59
    @property (nonatomic,copy) NSString *imgURL; UIWebView *_web; NSInteger _gesState;- (void)webViewDidFinishLoad:(UIWebView *)webView{ [MBProgressHUD hideHUD];... //实现图片长按识别功能 static NSStri
  • 然后长按图片无法识别,如果单独将图片拿出来不放入组件则可以识别,请问下,是不是框架阻止了长按屏幕的响应</p><p>该提问来源于开源项目:chjtx/JRoll</p></div>
  • [b]前提:[/b] [color=red]本文使用了 ButterKnife 依赖库[/color] 开始环境: Android Studio 在 Module 文件夹下的 build.gradle 文件追加 zxing 依赖: ...之后添加图片长按事件(此处使...
  • 2.ios微信内iframe页面,长按图片不出识别二维码功能 解决办法: 用 postMessage处理两个页面的跨域问题:https://www.cnblogs.com/roam/p/7520433.html 在长按iframe二维码图片时,在父级页面生成一个二维码...
  • 同时识别图片是否是二维码,如果是则在弹框追加识别二维码功能。 细节上:保存图片的弹框要显示在手指长按的位置;选择图片保存后,可以让用户直接去相册查看;选择识别二维码,判断是是不是网址,是的话可以让...
  • 在小程序image组件中二维码/小程序码图片不支持长按识别,仅在 wx.previewImage 中支持长按识别 但是通过wx.previewImage只能实现保存,转发,小程序 只能识别 小程序二维码,别的不能实现。 <image src="{{url}}...
  • 随着小程序的发展微信小程序中为了更加方便用户体验,在小程序中添加图片预览、长按转发、保存、收藏、识别图中二维码等。 注:小程序中只支持预览后长按识别小程序二维码,其他的不支持! 前端代码: <view ...
  • 不需要和H5做交互实现长按识别网页当中的图片,然后配合识别二维码功能即可实现长按识别网页当中二维码操作,于是有了下面的工具长按识别网页图片 框架整体介绍 作者信息 作者其他库 使用方法 作者信息 Github...
  • 随着小程序的发展微信小程序中为了更加方便用户体验,在小程序中添加图片预览、长按转发、保存、收藏、识别图中二维码等 前端代码: &lt;view wx:for="{{imgalist}}"wx:for-item="image...
  • zxing二维码生成扫描,识别二维码图片长按识别二维码调用方便简洁,可选择导入as的modules 只需要在bulid.gradle(app) 的dependencies :里面 compile project(path: ':BarCode')一下就能用。

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 190
精华内容 76
关键字:

长按图片识别图中二维码