Flutter图像搜索识别插件saucenao的使用

Flutter图像搜索识别插件SauceNAO的使用

示例

下面是一个完整的示例代码,展示如何在Flutter项目中使用SauceNAO插件进行图像搜索识别。

示例代码

import 'package:flutter/material.dart';
import 'package:saucenao/saucenao.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("SauceNAO 图像搜索识别"),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 初始化SauceNAO对象,并传入API Key
              final sauceNao = SauceNao(apiKey: 'YOUR_API_KEY');

              // 指定要搜索的图像URL
              final imageUrl = 'https://i.imgur.com/rAQJOIJ.png';

              // 调用find方法获取搜索结果
              final results = await sauceNao.find(imageUrl);

              // 打印搜索结果的第一项
              print(results.results.first);
            },
            child: Text("开始搜索"),
          ),
        ),
      ),
    );
  }
}

输出示例

当你点击按钮后,控制台会输出类似以下的信息:

{
  anidbId: 1411,
  anilistId: 101921,
  estimatedTime: "00:07:17 / 00:24:00",
  externalUrls: [
    "https://anidb.net/anime/14111",
    "https://myanimelist.net/anime/37999/",
    "https://anilist.co/anime/101921/"
  ],
  episode: "07",
  source: "Kaguya-sama wa Kokurasetai: Tensai-tachi no Ren'ai Zunousen",
  year: "2019-2019",
}

更多关于Flutter图像搜索识别插件saucenao的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图像搜索识别插件saucenao的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在使用 Flutter 进行图像搜索识别时,可以借助 Saucenao 的 API 来实现。Saucenao 是一个基于图像的反向搜索引擎,可以帮助用户通过上传图片来搜索相关的信息。以下是如何在 Flutter 中使用 Saucenao 的步骤:

1. 获取 Saucenao API Key

首先,你需要注册一个 Saucenao 账号并获取 API Key。你可以在 Saucenao 网站上注册并获取 API Key。

2. 添加依赖库

pubspec.yaml 文件中添加 http 依赖库,用于发送 HTTP 请求。

dependencies:
  flutter:
    sdk: flutter
  http: ^0.13.3

然后运行 flutter pub get 来安装依赖。

3. 创建 Saucenao 服务

创建一个 Dart 文件(如 saucenao_service.dart)来处理与 Saucenao API 的交互。

import 'dart:convert';
import 'package:http/http.dart' as http;

class SaucenaoService {
  final String apiKey;

  SaucenaoService(this.apiKey);

  Future<Map<String, dynamic>> searchImage(String imageUrl) async {
    final uri = Uri.parse('https://saucenao.com/search.php');
    final response = await http.post(
      uri,
      body: {
        'url': imageUrl,
        'output_type': '2',
        'api_key': apiKey,
      },
    );

    if (response.statusCode == 200) {
      return jsonDecode(response.body);
    } else {
      throw Exception('Failed to load image search results');
    }
  }
}

4. 在 Flutter 应用中调用 Saucenao 服务

在你的 Flutter 应用中调用上述服务来进行图像搜索。

import 'package:flutter/material.dart';
import 'saucenao_service.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ImageSearchScreen(),
    );
  }
}

class ImageSearchScreen extends StatefulWidget {
  [@override](/user/override)
  _ImageSearchScreenState createState() => _ImageSearchScreenState();
}

class _ImageSearchScreenState extends State<ImageSearchScreen> {
  final SaucenaoService saucenaoService = SaucenaoService('YOUR_API_KEY_HERE');
  String imageUrl = '';
  Map<String, dynamic> searchResults;

  void searchImage() async {
    try {
      final results = await saucenaoService.searchImage(imageUrl);
      setState(() {
        searchResults = results;
      });
    } catch (e) {
      print('Error: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Saucenao Image Search'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              decoration: InputDecoration(labelText: 'Enter Image URL'),
              onChanged: (value) {
                setState(() {
                  imageUrl = value;
                });
              },
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: searchImage,
              child: Text('Search'),
            ),
            SizedBox(height: 20),
            if (searchResults != null)
              Expanded(
                child: ListView.builder(
                  itemCount: searchResults['results'].length,
                  itemBuilder: (context, index) {
                    final result = searchResults['results'][index];
                    return ListTile(
                      title: Text(result['header']['index_name']),
                      subtitle: Text(result['data']['title'] ?? 'No title'),
                    );
                  },
                ),
              ),
          ],
        ),
      ),
    );
  }
}
回到顶部