flutter 顺逆时针旋转图片铺满比例区域

最近遇到一个项目需求,这里记录下。将图片进行顺时针旋转90°和逆时针90°,保证图片都铺满矩形框区域

import 'dart:async';
import 'dart:io';
import 'dart:math';
import 'dart:ui' as ui;import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
class MyHomePage extends StatefulWidget {const MyHomePage({super.key});@overrideState<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage> {double rate = 4 / 6;String imageUrl ='https://ss0.baidu.com/94o3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/b2de9c82d158ccbfb40a4fd81bd8bc3eb035419a.jpg';double imageWidth = 0;double imageHeight = 0;double scale = 1;double angle = 0;Future? future;@overridevoid initState() {future = download();super.initState();}@overrideWidget build(BuildContext context) {return Scaffold(backgroundColor: const Color(0xFFF5F9FA),appBar: AppBar(title: const Text('图片旋转'),),body: FutureBuilder(future: future,builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {if (snapshot.data == null) {return const SizedBox();}Uint8List bytes = snapshot.data;return Column(children: [ElevatedButton(onPressed: () {changeAngle(false);},child: const Text('逆时针')),ElevatedButton(onPressed: () {changeAngle(true);},child: const Text('顺时针')),AspectRatio(aspectRatio: rate,child: Container(width: double.infinity,height: double.infinity,color: Colors.blue,padding: const EdgeInsets.all(6),child: LayoutBuilder(builder: (c, b) {if (angle % pi != 0) {scale = getMinMaxScaleSingle(b.maxWidth, b.maxHeight);} else {scale = 1;}return Transform.scale(scale: scale,child: Transform.rotate(angle: angle,child: Image.memory(bytes),),);},),),)],);},),);}changeAngle(bool clockwise) {if (clockwise) {angle += pi / 2;if (angle == pi * 2) angle = 0;} else {angle -= pi / 2;if (angle == -pi * 2) angle = 0;}if (mounted) setState(() {});}//获得单个图片区域的最小最大缩放比例double getMinMaxScaleSingle(double width, double height) {final fittedSizes = getFittedSizes(width, height);double imgWidth = fittedSizes.destination.width;double imgHeight = fittedSizes.destination.height;if (angle % pi != 0) {imgWidth = fittedSizes.destination.height;imgHeight = fittedSizes.destination.width;}double scaleX = width / imgWidth;double scaleY = height / imgHeight;double minScale = scaleX > scaleY ? scaleY : scaleX;return minScale;}FittedSizes getFittedSizes(double width, double height) {return applyBoxFit(BoxFit.contain, Size(imageWidth, imageHeight), Size(width, height));}Future download() async {var httpClient = HttpClient();try {var request = await httpClient.getUrl(Uri.parse(imageUrl));var response = await request.close();var imageByte = await consolidateHttpClientResponseBytes(response);var codec = await ui.instantiateImageCodec(imageByte);ui.FrameInfo fi = await codec.getNextFrame();imageWidth = fi.image.width * 1.0;imageHeight = fi.image.height * 1.0;return imageByte;} catch (error) {return null;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216707.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式实习难找怎么办?

今日话题&#xff0c;嵌入式实习难找怎么办&#xff1f;个人建议如果找不到实习机会&#xff0c;可以回归学习嵌入式所需的知识&#xff0c;积累项目经验或者回顾之前参与过的项目&#xff0c;将它们整理复盘。如果还有时间&#xff0c;可以再尝试找实习&#xff0c;如果找不到…

GSIL:GitHub敏感信息泄露监控工具使用

GSIL:GitHub敏感信息泄露监控工具使用 1.工具概述2.安装3.配置4.用法1.工具概述 凭据和API可能会泄露在公司的公共存储库或github公司的用户的存储库中,GSIL用于实时监控GitHub敏感信息泄露,并发送告警通知 2.安装 git clone git@github.com:FeeiCN/GSIL.git pip install …

ARM NEON加速介绍及使用示例

ARM NEON 是 ARM 架构中的SIMD (Single Instruction, Multiple Data) 扩展&#xff0c;它提供了一组专用的指令和寄存器&#xff0c;用于高效地处理并行数据。在 Linux 内核中&#xff0c;ARM NEON 驱动提供了对 NEON 寄存器和指令的支持&#xff0c;以便在内核中利用 NEON 进行…

【开题报告】基于SpringBoot的个人博客的设计与实现

1.选题背景 &#xff08;1&#xff09;技术研究需求&#xff1a; 当今社会&#xff0c;个人博客作为一种重要的网络传播形式&#xff0c;已经成为许多人记录、分享个人见解和经验的重要平台。然而&#xff0c;现有的个人博客系统在易用性、扩展性和定制化方面存在一定的局限性…

(第69天)可刷新 PDB

介绍 从 Oracle 12CR2 版本开始支持可刷新 PDB,在 19C 版本后功能更加强大,为什么会衍生出这个技术呢? 很多生产的 PDB 数据量很大,如果使用传统的方式进行克隆操作可能需要相当长的时间,并且克隆之后的数据无法随着源库更新而刷新,为了尽量减少对生产系统库的影响,可刷…

anolisos8.8安装显卡+CUDA工具+容器运行时支持(containerd/docker)+k8s部署GPU插件

anolisos8.8安装显卡及cuda工具 一、目录 1、测试环境 2、安装显卡驱动 3、安装cuda工具 4、配置容器运行时 5、K8S集群安装nvidia插件 二、测试环境 操作系统&#xff1a;Anolis OS 8.8 内核版本&#xff1a;5.10.134-13.an8.x86_64 显卡安装版本&#xff1a;525.147.05 c…

java学生选课系统 数据库版

首先让我们创建一个数据库让我们向表中插入数据然后查询它

ubuntu 20.04.6 server 服务器 下载与安装(配置静态IP)

下载地址&#xff1a;https://releases.ubuntu.com/20.04.6/ubuntu-20.04.6-live-server-amd64.iso 第一步&#xff1a; 准备U盘&#xff0c;使用软碟通将下载好的镜像写入到U盘中 软碟通网址&#xff1a;https://www.cn.ultraiso.net/xiazai.html 点击&#xff1a;文件 ->…

odoo16 全局搜索菜单

实现效果: 主要思路: 参考原生的many2one字段的相关源码&#xff0c;添加 systray 组件

sql server导出与导入

本文解决&#xff1a;不同版本sql server复制表、导数据&#xff1b;把数据库的结构和全部数据从2016版导入到2014版。 分离数据为mdf,ldf后&#xff0c;导入过程中无权限、被占用问题。 使用脚本&#xff08;.sql文件&#xff09; 导出 选中你要导出的数据库&#xff0c;右…

算法通关村第十七关 | 黄金挑战 | 跳跃游戏

1.跳跃游戏 原题&#xff1a;力扣55. 逐步判断下一步的覆盖范围&#xff0c;根据范围去推断是否能到达终点&#xff0c;不用计较每一步走到哪里。 public boolean canJump(int[] nums) {// 题目规定 nums 长度大于等于1if (nums.length 1) {return true;}int cover 0;// f…

python 中Windows编程一些心得

主要思路 当我们显示所有消息的信息时&#xff0c;我们可以知道Windows后台是如何传递消息给我们&#xff0c;但是并不会把所有东西写进开发文档 &#xff0c;这有一定的原因 但是 我们要自己去理解或者猜想开发者思路或者根据反馈结果来分析消息的作用&#xff0c;不然永远只…

java面试题-Dubbo和zookeeper运行原理

远离八股文&#xff0c;面试大白话&#xff0c;通俗且易懂 看完后试着用自己的话复述出来。有问题请指出&#xff0c;有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来&#xff0c;大家一起解决。 java面试题汇总-目录-持续更新中 分布式注册中心和服务调…

线程|如何实现守护线程?

文章目录 守护线程是什么&#xff1f;守护线程有哪些应用场景?守护线程如何实现&#xff1f; 守护线程是什么&#xff1f; 守护线程是一种特殊的线程&#xff0c;它是在后台运行的线程&#xff0c;主要用于执行一些如垃圾回收、内存管理等“后台”任务。这些线程通常不会直接…

自定义字符串排序

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 一、题目描述 给定两个字符串 order 和 s 。order 的所有单词都是 唯一 的&#xff0c;并且以前按照一…

HNU计算机视觉作业三

前言 选修的是蔡mj老师的计算机视觉&#xff0c;上课还是不错的&#xff0c;但是OpenCV可能需要自己学才能完整把作业写出来。由于没有认真学&#xff0c;这门课最后混了80多分&#xff0c;所以下面作业解题过程均为自己写的&#xff0c;并不是标准答案&#xff0c;仅供参考 …

鸿蒙开发之状态管理@State

1、视图数据双向绑定 鸿蒙开发采用的声明式UI&#xff0c;利用状态驱动UI的更新。其中State被称作装饰器&#xff0c;是一种状态管理的方式。 状态&#xff1a;指的是被装饰器装饰的驱动视图更新的数据。 视图&#xff1a;是指用户看到的UI渲染出来的界面。 之所以成为双向…

计算机网络实验8

实验目的&#xff1a; 通过实验掌握下列知识&#xff1a; 掌握小型园区网络综合设计。 实验过程分析&#xff1a;配置命令 1&#xff09; 罗列步骤2&#xff09;中各设备的配置命令。 Internet: interface ser1/0 ip address 100.1.1.1 24 quit RTA: sysname RTA_LXL interfa…

Go性能分析工具

前言 作为后端研发&#xff0c;性能分析是我们在研发过程中必然会会遇到的环节&#xff0c;接口耗时、堆栈溢出、内存泄露等等。所谓工欲善其事必先利其器&#xff0c;之前在java中我们是使用arthas这一大神器&#xff0c;不得不说确实好用&#xff0c;想了解arthas的可以看下…

Stm32-使用TB6612驱动电机及编码器测速

这里写目录标题 起因一、电机及编码器的参数二、硬件三、接线四、驱动电机1、TB6612电机驱动2、定时器的PWM模式驱动电机 五、编码器测速1、定时器的编码器接口模式2、定时器编码器模式测速的原理3、编码器模式的配置4、编码器模式相关代码5、测速方法 六、相关问题以及解答1、…