flutter 采用 BlurHash 算法实现图像缩略图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oJABtYBp-1629332631551)(https://ducafecat.tech/2021/08/19/translation/exploring-blurhash-image-placeholder-in-flutter/2021-08-19-06-32-44.png)]

原文

https://medium.com/flutterdevs/exploring-blurhash-image-placeholder-in-flutter-24dad611c487

代码

https://github.com/ducafecat/getx_quick_start

参考

  • https://pub.dev/packages/flutter_blurhash
  • https://blurha.sh/
  • https://github.com/woltapp/blurhash

正文

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-odpQHWbo-1629332631553)(https://ducafecat.tech/2021/08/19/translation/exploring-blurhash-image-placeholder-in-flutter/2021-08-19-06-19-55.png)]

根据联想速度的不同,从网络中叠加一张图片可能需要几分钟时间。在获取图片时,完全可以预期它会显示一个占位符。有一些显示占位符的策略。例如,您可以显示一个彩色框。在任何情况下,如果占位符可以像真实的图片一样,那就更令人愉快了。因此,你可以使用 BlurHash。

在这个博客中,我们将探索 Flutter 图片占位符。我们将看到如何实现 blur hash 的演示程序,以及如何使用 BlurHash 作为图像占位符,在您的 flutter 应用程序中使用 flutter_blurhash 包。

https://pub.dev/packages/flutter_blurhash

简介

BlurHash 是图片占位符的保守描述。它的工作原理是从图片生成一个散列字符串。生成的散列字符串将用于传递占位符。本文介绍了在 Flutter 应用程序中解析要作为图片占位符交付的 BlurHash 字符串的最佳方法。

演示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mpv0xzEU-1629332631553)(https://ducafecat.tech/2021/08/19/translation/exploring-blurhash-image-placeholder-in-flutter/demo.gif)]

这个演示视频展示了如何在 Flutter 中使用 blurhash。它展示了 blurhash 如何在您的 Flutter 应用程序中使用 flutter_blurhash

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter 并没有提供专门的验证码图片算法,但可以使用 Flutter 提供的图形绘制 API 和随机数生成 API 来实现验证码图片算法。 以下是一个简单的示例代码,实现了一个四位数的数字验证码图片生成: ```dart import 'dart:math'; import 'dart:ui'; import 'package:flutter/material.dart'; class CaptchaImage extends StatefulWidget { final ValueChanged<String> onCaptchaChanged; CaptchaImage({Key key, this.onCaptchaChanged}) : super(key: key); @override _CaptchaImageState createState() => _CaptchaImageState(); } class _CaptchaImageState extends State<CaptchaImage> { String captcha; final TextEditingController _textEditingController = TextEditingController(); @override void initState() { super.initState(); _generateCaptcha(); } void _generateCaptcha() { setState(() { captcha = _generateRandomString(4); // 生成四个随机数字 widget.onCaptchaChanged?.call(captcha); }); } String _generateRandomString(int length) { var random = Random.secure(); var values = List<int>.generate(length, (i) => random.nextInt(10)); return values.join(); } @override Widget build(BuildContext context) { return GestureDetector( onTap: _generateCaptcha, child: CustomPaint( size: Size(100, 40), painter: CaptchaPainter(captcha), ), ); } } class CaptchaPainter extends CustomPainter { final String captcha; final Paint _paint = Paint() ..color = Colors.black ..strokeWidth = 1.5 ..style = PaintingStyle.stroke; CaptchaPainter(this.captcha); @override void paint(Canvas canvas, Size size) { // 绘制背景 canvas.drawRect(Rect.fromLTWH(0, 0, size.width, size.height), Paint()..color = Colors.white); // 绘制验证码 var textStyle = TextStyle(fontSize: 24, fontWeight: FontWeight.bold); var textSpan = TextSpan( text: captcha, style: textStyle, ); var textPainter = TextPainter( text: textSpan, textAlign: TextAlign.center, textDirection: TextDirection.ltr, ); textPainter.layout(minWidth: 0, maxWidth: size.width); textPainter.paint(canvas, Offset((size.width - textPainter.width) / 2, 8)); // 绘制干扰线 var random = Random.secure(); for (int i = 0; i < 4; i++) { var startX = random.nextInt(size.width.toInt()); var startY = random.nextInt(size.height.toInt()); var endX = random.nextInt(size.width.toInt()); var endY = random.nextInt(size.height.toInt()); canvas.drawLine(Offset(startX.toDouble(), startY.toDouble()), Offset(endX.toDouble(), endY.toDouble()), _paint); } } @override bool shouldRepaint(CustomPainter oldDelegate) { return true; } } ``` 这个示例代码中,`CaptchaImage` 是一个自定义的 `StatefulWidget`,用来生成验证码图片。`CaptchaPainter` 是一个自定义的 `CustomPainter`,用来绘制验证码图片。在 `CaptchaPainter` 中,我们先绘制一个白色的矩形作为背景,然后使用 `TextPainter` 绘制随机生成的四个数字,最后再绘制四条随机干扰线。在 `CaptchaImage` 中,我们通过 `CustomPaint` 将 `CaptchaPainter` 绘制出来,并且通过 `GestureDetector` 来响应用户点击事件,生成新的验证码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值