IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 我用2天学习(摸鱼)时间教你实战Flutter Deskstop之Tinypng(熊猫图片压缩)GUI工具 -> 正文阅读

[移动开发]我用2天学习(摸鱼)时间教你实战Flutter Deskstop之Tinypng(熊猫图片压缩)GUI工具

前言

在这里插入图片描述

Tinypng是一个在设计和技术界十分流行的图片压缩网站,但是它只有网页版,没有GUI。幸好的是它支持通过apikey直接运行api接口压缩图片,虽然业内已经有很多版本的GUI,Window,Mac都有,但是这几天学习Flutter Deskstop,正好可以用来实战。目前的版本只打包了macos版本,window版本我有空找个机子再调试下,理论上无需太多改动。

代码过程

实现选择文件

选择文件这块的实现,由于我本身是做iOS开发的,macOS原生开发其实也大同小异,但是为了兼容多端,我也懒得一个个写插件了,搜了下现成支持deskstop的差距发现file_picker这个插件完美支持我的想法,不管是window,mac,还是linux通通都支持。目前只支持选择jpg,png的文件,貌似webp和h265都是支持的,后期我可以加上。

void _pickFiles() async {
    if (await controller.checkHaveApiKey() == false) {
      _showSettingBottomSheet();
      showToast("Please enter your TinyPNG Apikey",
          textPadding: EdgeInsets.all(15));
      return;
    }
    FilePickerResult? result =
        await FilePicker.platform.pickFiles(allowMultiple: true);
    if (result != null) {
      List<File> files = result.paths.map((path) => File(path ?? "")).toList();
      List<File> chooseFiles = [];
      files.forEach((element) {
        if (element.path.toLowerCase().endsWith("jpg") ||
            element.path.toLowerCase().endsWith("jpeg") ||
            element.path.toLowerCase().endsWith("png")) {
          chooseFiles.add(element);
        } else {
          showToast('invalid image file', textPadding: EdgeInsets.all(15));
          print("invalid image file : ${element.path}");
        }
      });
      if (chooseFiles.isNotEmpty) {
        controller.refreshWithFileList(chooseFiles);
      }
    } else {
      showToast("Cancel Pick files", textPadding: EdgeInsets.all(15));
    }
  }

实现打开目录或者打开网址

这块一开始想了很久,iOS端是要通过urlLaunch跳转的,搜了下pub很多现场的库都只支持iOS和安卓对桌面不是很友好。突然灵机一动Swift脚本可以通过Process类直接运行terminal命令,dart是否有相关api支持?如果有的话打开目录 只需要一行命令 open xxx, 打开网址只需要open xxx.com。答案是显而易见的,dart也封装了 Proccess类,代码如下。

//打开图片压缩后目录

Process.run("open", [savePath]);

//打开跳转网址

Process.run("open", ["https://tinypng.com/developers"]);

实现上传原图文件到Tiny

这个没啥好说,看看http规则,直接撸代码即可。

Future<TinyImageInfo?> uploadOriginImage({required Uint8List? buffer}) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    var apiKey =  prefs.getString(KApiKey);
    if (apiKey == null || apiKey.length == 0) {
      return null;
    }
    var url = "api.tinify.com";
    Uri uri = Uri.https(url, "/shrink");
    var auth = "api:$apiKey";
    var authData = base64Encode(utf8.encode(auth));
    var authorizationHeader = "Basic " + authData;
    var headers = {
      "Accept": "application/json",
      "Authorization": authorizationHeader,
    };
    try {
      var response = await http.post(uri, headers: headers, body: buffer);
      if (response.statusCode != 201) {
        print("fail code is ${response.statusCode}");
        return null;
      } else {
        var json = jsonDecode(utf8.decode(response.bodyBytes));
        var jsonString = jsonEncode(json);
        print("success json $jsonString");
        return TinyImageInfo.fromJson(json);
      }
    } catch (e) {
      print("catch upload error $e");
      return null;
    }
  }

实现下载压缩后图片到自己目录

TinyPng上传原图成功而且压缩处理完成后会返回这样一串Json

{“input”:{“size”:84736,“type”:“image/webp”},“output”:{“size”:68282,“type”:“image/webp”,“width”:658,“height”:1009,“ratio”:0.8058,“url”:“https://api.tinify.com/output/avxq4rhjha1apfra92pzfnrcj2n0zdbx”}}

里面包含了压缩率,原图size,压缩后size,压缩后输出地址等等。有了这个json我们自然就能构建我们的UI了。

Future<bool> downloadOutputImage(TinyImageInfo imageInfo, String savePath,
      {Function(int count, int total)? onReceiveProgress}) async {
    String? url = imageInfo.output?.url;
    String? type = imageInfo.output?.type;
    if (url == null || type == null) {
      return false;
    }
    Uri uri = Uri.parse(url);
    var dio = Dio();
    try {
      var rsp = await dio.downloadUri(
        uri,
        savePath,
        options: Options(
          headers: {"Accept": type, "Content-Type": "application/json"},
        ),
        onReceiveProgress: (count, total) {
          onReceiveProgress?.call(count, total);
        },
      );
      return rsp.statusCode == 200;
    } catch (e) {
      return false;
    }
  }

Mac应用权限问题

要配置一下这几个权限,不然应用会各种权限报错。

<key>com.apple.security.app-sandbox</key>
	<false/>
	<key>com.apple.security.cs.allow-jit</key>
	<true/>
	<key>com.apple.security.network.server</key>
	<true/>
	<key>com.apple.security.network.client</key>
	<true/>
	<key>com.apple.security.files.user-selected.read-write</key>

状态管理

我用了目前比较流行的Gex状态管理,只需要监听几个属性即可。

final PathProviderPlatform provider = PathProviderUtil.provider();
  var taskList = <TinyImageInfoItemViewModel>[].obs;
  var savePath = "".obs;
  var apiKey = "".obs;
  var taskCount = 0.obs;
  var saveKb = 0.0.obs;

用到的三方库

  • http
  • dio
  • file_picker
  • path_provider
  • path_provider_macos
  • get
  • oktoast
  • shared_preferences

项目地址

此项目完全开源,想学习的小伙伴可以去GitHub查看,有帮助到你们的麻烦给个Star哈。此项目基于Flutter 2.2.3开发,理论上是兼容更高的版本。(没有实测)

https://github.com/JerryFans/TinyPNG4Flutter

安装包

不想编译的可以直接用安装包

dmg安装包

pkg安装包

未来

1、window版本打包
2、linux版本? (貌似用的群体不多吧)
3、mac版本支持文件拖拽过去(看了mac AppKit文档,这个其实不是很难,只需要做个插件就行,未来会做好并开源)
4、上架AppStore提供给麻瓜用

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-01-08 14:08:36  更:2022-01-08 14:08:58 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:46:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码