Image processing 如何在颤振中从画布裁剪圆形(或方形或六边形)区域
我想裁剪一个矩形的图像文件,使其成为圆形、方形或六边形,然后将其保存为本地图像文件。我有一个位图,我想从这个位图裁剪一个圆形或六边形区域。圆圈外的所有像素都应该是透明的。我该怎么做 我在平台上发现了类似的问题。但无法找到一个好的资源,真正帮助或指导我实现这一点在颤振。请与我分享实现此结果的想法。您可以使用此软件包 您可以使用该软件包Image processing 如何在颤振中从画布裁剪圆形(或方形或六边形)区域,image-processing,flutter,flutter-layout,flutter-test,flutter-canvas,Image Processing,Flutter,Flutter Layout,Flutter Test,Flutter Canvas,我想裁剪一个矩形的图像文件,使其成为圆形、方形或六边形,然后将其保存为本地图像文件。我有一个位图,我想从这个位图裁剪一个圆形或六边形区域。圆圈外的所有像素都应该是透明的。我该怎么做 我在平台上发现了类似的问题。但无法找到一个好的资源,真正帮助或指导我实现这一点在颤振。请与我分享实现此结果的想法。您可以使用此软件包 您可以使用该软件包 使用裁剪器裁剪图像 使用ClipRRect、ClipOval,您还可以使用自定义裁剪器为图像提供自定义形状 检查此链接 )使用裁剪器裁剪图像 使用ClipRRec
使用裁剪器裁剪图像 使用ClipRRect、ClipOval,您还可以使用自定义裁剪器为图像提供自定义形状 检查此链接
)使用裁剪器裁剪图像 使用ClipRRect、ClipOval,您还可以使用自定义裁剪器为图像提供自定义形状 检查此链接
)这些简单的步骤可以得到所需的结果。
import 'dart:io';
import 'package:flutter/material.dart';
import 'dart:ui' as ui;
import 'package:flutter/services.dart' show rootBundle;
import 'dart:async';
import 'dart:typed_data';
import 'dart:math' as math;
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
class CustomImageCanvas extends StatefulWidget {
CustomImageCanvas({Key key, this.title}) : super(key: key);
final String title;
@override
_CustomImageCanvasState createState() => _CustomImageCanvasState();
}
class _CustomImageCanvasState extends State<CustomImageCanvas> {
ui.Image image;
bool isImageloaded = false;
void initState() {
super.initState();
init();
}
Future<Null> init() async {
final ByteData data = await rootBundle.load('assets/image.jpeg');
image = await loadImage(Uint8List.view(data.buffer));
}
Future<ui.Image> loadImage(List<int> img) async {
final Completer<ui.Image> completer = Completer();
ui.decodeImageFromList(img, (ui.Image img) {
setState(() {
isImageloaded = true;
});
return completer.complete(img);
});
return completer.future;
}
Widget _buildImage() {
if (this.isImageloaded) {
return CustomPaint(
painter: PngImagePainter(image: image),
);
} else {
return Center(child: Text('loading'));
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Container(
child: _buildImage(),
));
}
}
class PngImagePainter extends CustomPainter {
PngImagePainter({
this.image,
});
ui.Image image;
@override
void paint(Canvas canvas, Size size) {
_drawCanvas(size, canvas);
_saveCanvas(size);
}
Canvas _drawCanvas(Size size, Canvas canvas) {
final center = Offset(150, 50);
final radius = math.min(size.width, size.height) / 8;
// The circle should be paint before or it will be hidden by the path
Paint paintCircle = Paint()..color = Colors.black;
Paint paintBorder = Paint()
..color = Colors.white
..strokeWidth = size.width / 36
..style = PaintingStyle.stroke;
canvas.drawCircle(center, radius, paintCircle);
canvas.drawCircle(center, radius, paintBorder);
double drawImageWidth = 0;
var drawImageHeight = -size.height * 0.8;
Path path = Path()
..addOval(Rect.fromLTWH(drawImageWidth, drawImageHeight,
image.width.toDouble(), image.height.toDouble()));
canvas.clipPath(path);
canvas.drawImage(image, Offset(drawImageWidth, drawImageHeight), Paint());
return canvas;
}
_saveCanvas(Size size) async {
var pictureRecorder = ui.PictureRecorder();
var canvas = Canvas(pictureRecorder);
var paint = Paint();
paint.isAntiAlias = true;
_drawCanvas(size, canvas);
var pic = pictureRecorder.endRecording();
ui.Image img = await pic.toImage(image.width, image.height);
var byteData = await img.toByteData(format: ui.ImageByteFormat.png);
var buffer = byteData.buffer.asUint8List();
// var response = await get(imgUrl);
var documentDirectory = await getApplicationDocumentsDirectory();
File file = File(join(documentDirectory.path,
'${DateTime.now().toUtc().toIso8601String()}.png'));
file.writeAsBytesSync(buffer);
print(file.path);
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return false;
}
}
导入'dart:io';
进口“包装:颤振/材料.省道”;
将“dart:ui”导入为ui;
导入“包:flatter/services.dart”显示根包;
导入“dart:async”;
导入“dart:键入的_数据”;
导入'dart:math'作为数学;
导入“package:path/path.dart”;
导入“package:path_provider/path_provider.dart”;
类CustomImageCanvas扩展StatefulWidget{
CustomImageCanvas({Key-Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_CustomImageCanvasState createState()=>_CustomImageCanvasState();
}
类\u CustomImageCanvasState扩展状态{
ui.图像;
bool-isimageload=false;
void initState(){
super.initState();
init();
}
Future init()异步{
final ByteData data=wait rootBundle.load('assets/image.jpeg');
image=wait loadImage(Uint8List.view(data.buffer));
}
未来加载映像(列表img)异步{
最终完成者完成者=完成者();
ui.decodeMageFromList(img,(ui.Image img){
设置状态(){
isImageloaded=true;
});
返回完成符。完成(img);
});
返回completer.future;
}
小部件_buildImage(){
如果(此.isImageloaded){
返回自定义油漆(
画家:PngImagePainter(图像:图像),
);
}否则{
返回中心(子项:文本(“加载”);
}
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
主体:容器(
子项:_buildImage(),
));
}
}
类PngImagePainter扩展了CustomPainter{
油漆工({
这个,这个形象,,
});
ui.图像;
@凌驾
空心油漆(帆布,尺寸){
_帆布(尺寸、帆布);
_保存画布(大小);
}
Canvas\u drawCanvas(尺寸、画布){
最终中心=偏移量(150,50);
最终半径=数学最小值(尺寸、宽度、尺寸、高度)/8;
//应在绘制之前绘制圆,否则它将被路径隐藏
绘制画圈=绘制()…颜色=颜色。黑色;
Paint paintBorder=Paint()
…颜色=颜色。白色
..冲程宽度=尺寸宽度/36
..风格=绘画风格.笔划;
画布.画圈(中心、半径、画圈);
画布.画圈(中心、半径、画框);
双drawImageWidth=0;
var drawImageHeight=-size.height*0.8;
路径路径=路径()
…添加椭圆形(垂直于LTWH(drawImageWidth,drawImageHeight,
image.width.toDouble(),image.height.toDouble();
canvas.clipPath(路径);
drawImage(图像,偏移量(drawImageWidth,drawImageHeight),Paint());
返回画布;
}
_saveCanvas(大小)异步{
var pictureRecorder=ui.pictureRecorder();
var canvas=画布(pictureRecorder);
var paint=paint();
paint.Isatarias=真;
_帆布(尺寸、帆布);
var pic=pictureRecorder.endRecording();
ui.Image img=wait pic.toImage(Image.width,Image.height);
var byteData=wait img.toByteData(格式:ui.ImageByteFormat.png);
var buffer=byteData.buffer.asUint8List();
//var响应=等待获取(imgUrl);
var documentDirectory=等待getApplicationDocumentsDirectory();
文件=文件(join(documentDirectory.path,
“${DateTime.now().toUtc().toIso8601String()}.png');
writeAsBytesSync文件(缓冲区);
打印(file.path);
}
@凌驾
bool应重新绘制(自定义代理){
返回false;
}
import 'dart:io';
import 'package:flutter/material.dart';
import 'dart:ui' as ui;
import 'package:flutter/services.dart' show rootBundle;
import 'dart:async';
import 'dart:typed_data';
import 'dart:math' as math;
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
class CustomImageCanvas extends StatefulWidget {
CustomImageCanvas({Key key, this.title}) : super(key: key);
final String title;
@override
_CustomImageCanvasState createState() => _CustomImageCanvasState();
}
class _CustomImageCanvasState extends State<CustomImageCanvas> {
ui.Image image;
bool isImageloaded = false;
void initState() {
super.initState();
init();
}
Future<Null> init() async {
final ByteData data = await rootBundle.load('assets/image.jpeg');
image = await loadImage(Uint8List.view(data.buffer));
}
Future<ui.Image> loadImage(List<int> img) async {
final Completer<ui.Image> completer = Completer();
ui.decodeImageFromList(img, (ui.Image img) {
setState(() {
isImageloaded = true;
});
return completer.complete(img);
});
return completer.future;
}
Widget _buildImage() {
if (this.isImageloaded) {
return CustomPaint(
painter: PngImagePainter(image: image),
);
} else {
return Center(child: Text('loading'));
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Container(
child: _buildImage(),
));
}
}
class PngImagePainter extends CustomPainter {
PngImagePainter({
this.image,
});
ui.Image image;
@override
void paint(Canvas canvas, Size size) {
_drawCanvas(size, canvas);
_saveCanvas(size);
}
Canvas _drawCanvas(Size size, Canvas canvas) {
final center = Offset(150, 50);
final radius = math.min(size.width, size.height) / 8;
// The circle should be paint before or it will be hidden by the path
Paint paintCircle = Paint()..color = Colors.black;
Paint paintBorder = Paint()
..color = Colors.white
..strokeWidth = size.width / 36
..style = PaintingStyle.stroke;
canvas.drawCircle(center, radius, paintCircle);
canvas.drawCircle(center, radius, paintBorder);
double drawImageWidth = 0;
var drawImageHeight = -size.height * 0.8;
Path path = Path()
..addOval(Rect.fromLTWH(drawImageWidth, drawImageHeight,
image.width.toDouble(), image.height.toDouble()));
canvas.clipPath(path);
canvas.drawImage(image, Offset(drawImageWidth, drawImageHeight), Paint());
return canvas;
}
_saveCanvas(Size size) async {
var pictureRecorder = ui.PictureRecorder();
var canvas = Canvas(pictureRecorder);
var paint = Paint();
paint.isAntiAlias = true;
_drawCanvas(size, canvas);
var pic = pictureRecorder.endRecording();
ui.Image img = await pic.toImage(image.width, image.height);
var byteData = await img.toByteData(format: ui.ImageByteFormat.png);
var buffer = byteData.buffer.asUint8List();
// var response = await get(imgUrl);
var documentDirectory = await getApplicationDocumentsDirectory();
File file = File(join(documentDirectory.path,
'${DateTime.now().toUtc().toIso8601String()}.png'));
file.writeAsBytesSync(buffer);
print(file.path);
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return false;
}
}