Commit 53f3c5e8 authored by 林生雨's avatar 林生雨

提交

parent a680c565
No preview for this file type
...@@ -4,8 +4,12 @@ ...@@ -4,8 +4,12 @@
**/ **/
import 'dart:ui' as ui; import 'dart:ui' as ui;
import 'package:flutter/cupertino.dart';
import 'package:flutter/src/gestures/drag_details.dart';
class PointItem { class PointItem {
List<ui.Offset> list = new List(); List<ui.Offset> list = new List();
List<ui.Offset> tempList = new List();
ui.Image image; ui.Image image;
double x = -1; double x = -1;
double y = -1; double y = -1;
...@@ -13,6 +17,11 @@ class PointItem { ...@@ -13,6 +17,11 @@ class PointItem {
double tranX = 0; double tranX = 0;
double tranY = 0; double tranY = 0;
bool drawPath = false; bool drawPath = false;
bool rectModel = false;
bool isDown = false;
ui.Rect rect = new Rect.fromLTRB(100, 100, 200, 200);
ui.Rect rectTemp = new Rect.fromLTRB(100, 100, 200, 200);
double downX, downY;
void reset() { void reset() {
list.clear(); list.clear();
...@@ -22,6 +31,7 @@ class PointItem { ...@@ -22,6 +31,7 @@ class PointItem {
tranY = 0; tranY = 0;
tranX = 0; tranX = 0;
drawPath = false; drawPath = false;
rect = new Rect.fromLTRB(100, 100, 200, 200);
} }
PointItem(); PointItem();
...@@ -64,12 +74,18 @@ class PointItem { ...@@ -64,12 +74,18 @@ class PointItem {
} }
addPoint(double x, double y) { addPoint(double x, double y) {
double realX = (x + getTranX()) / scareSize; if (rectModel) {
double realY = (y + getTranY()) / scareSize; return;
}
double realX = (x / scareSize + getTranX());
double realY = (y / scareSize + getTranY());
list.add(new ui.Offset(realX, realY)); list.add(new ui.Offset(realX, realY));
} }
removePoint() { removePoint() {
if (rectModel) {
return;
}
if (list.isNotEmpty) { if (list.isNotEmpty) {
list.removeAt(list.length - 1); list.removeAt(list.length - 1);
drawPath = false; drawPath = false;
...@@ -101,9 +117,113 @@ class PointItem { ...@@ -101,9 +117,113 @@ class PointItem {
} }
void close() { void close() {
if (rectModel) {
return;
}
if (list.isNotEmpty && list.length > 2) { if (list.isNotEmpty && list.length > 2) {
list.add(list[0]); list.add(list[0]);
drawPath = true; drawPath = true;
} }
} }
void drag(DragUpdateDetails details, double startTranX, double dragStartX,
double startTranY, double dragStartY, bool dragMark) {
double diffX = (details.localPosition.dx - dragStartX) / scareSize;
double diffY = (details.localPosition.dy - dragStartY) / scareSize;
bool pkWin = true;
if (drawPath && dragMark && isDown) {
pkWin = false;
list.clear();
for (int i = 0; i < tempList.length; i++) {
list.add(Offset(tempList[i].dx + diffX, tempList[i].dy + diffY));
}
print(
"TRAN ${(details.localPosition.dx - dragStartX)} ${(details.localPosition.dy - dragStartY)}");
}
//rectModel && scareSize == 1 ||
//&& scareSize != 1
if (rectModel && isDown) {
print(" ${downX} ${downY} ${rectTemp.left} ${rectTemp.top}");
//drag item
if (downX > rectTemp.left + 5 &&
downX < rectTemp.right - 5 &&
downY > rectTemp.top + 5 &&
downY < rectTemp.bottom - 5) {
pkWin = false;
rect = new Rect.fromLTRB(rectTemp.left + diffX, rectTemp.top + diffY,
rectTemp.right + diffX, rectTemp.bottom + diffY);
}
//left TOP
if (downX > rectTemp.left - 5 &&
downX < rectTemp.left + 5 &&
downY > rectTemp.top - 5 &&
downY < rectTemp.top + 5) {
pkWin = false;
double left = rectTemp.left + diffX;
double right = rectTemp.right;
double top = rectTemp.top + diffY;
double bottom = rectTemp.bottom;
if (rectTemp.left + diffX + 10 >= rectTemp.right) {
right = rectTemp.left + diffX + 10;
}
if (rectTemp.top + diffY + 10 >= rectTemp.bottom) {
bottom = rectTemp.top + diffY + 10;
}
rect = new Rect.fromLTRB(left, top, right, bottom);
}
if ((downX) > (rectTemp.right - 5) &&
(downX) < (rectTemp.right + 5) &&
(downY) > (rectTemp.bottom - 5) &&
(downY) < (rectTemp.bottom + 5)) {
pkWin = false;
//right bottom
double left = (rectTemp.left);
double right = (rectTemp.right + diffX);
double top = (rectTemp.top);
double bottom = (rectTemp.bottom + diffY);
if ((rectTemp.right + diffX - 10) <= (rectTemp.left)) {
left = (right - 10);
}
if ((rectTemp.bottom + diffY - 10) <= (rectTemp.top)) {
top = (bottom - 10);
}
rect = new Rect.fromLTRB(left, top, right, bottom);
}
}
if (pkWin && scareSize != 1) {
setTranX(
startTranX - (details.localPosition.dx - dragStartX) / scareSize);
setTranY(
startTranY - (details.localPosition.dy - dragStartY) / scareSize);
}
}
double getRealPosX(double pos) {
return (pos / scareSize + getTranX());
}
double getRealPosY(double pos) {
return pos / scareSize + getTranY();
}
void down(double tapStartX, double tapStartY, bool dragMask) {
isDown = true;
if (rectModel) {
downX = getRealPosX(tapStartX);
downY = getRealPosY(tapStartY);
rectTemp = new Rect.fromLTRB(
(rect.left), (rect.top), (rect.right), (rect.bottom));
}
if (drawPath) {
tempList = [];
tempList.addAll(list);
}
}
void dragEnd(DragEndDetails details) {
isDown = false;
}
} }
...@@ -9,52 +9,14 @@ import 'package:example_flutter/HomeModel/base/bean/PointItem.dart'; ...@@ -9,52 +9,14 @@ import 'package:example_flutter/HomeModel/base/bean/PointItem.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'dart:ui' as ui; import 'dart:ui' as ui;
// import 'package:flutter_animation_set/animator.dart';
//class WorkViewController extends StatefulWidget {
// @override
// State<StatefulWidget> createState() => WorkViewState();
//}
//
//class WorkViewState extends State<WorkViewController> {
// ui.Image img;
//
// @override
// void initState() {
// super.initState();
// String testImg =
// "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1574413347096&di=44b91b322281ad449b4d93cf79df3d0c&imgtype=0&src=http%3A%2F%2Fpic27.nipic.com%2F20130324%2F9252150_152129329000_2.jpg";
// loadImage(testImg).then((value) {
// setState(() {
// img = value;
// });
// });
// }
//
// @override
// Widget build(BuildContext context) {
// return CustomPaint(painter: WorkView(img));
// }
//
// Future<ui.Image> loadImage(var path) async {
// ImageStream stream = NetworkImage(
// path,
// ).resolve(ImageConfiguration.empty);
// Completer<ui.Image> completer = Completer<ui.Image>();
// void listener(ImageInfo frame, bool synchronousCall) {
// final ui.Image image = frame.image as ui.Image;
// completer.complete(image);
// stream.removeListener(ImageStreamListener(listener));
// }
//
// stream.addListener(ImageStreamListener(listener));
// return completer.future;
// }
//}
class WorkView extends CustomPainter { class WorkView extends CustomPainter {
PointItem item; PointItem item;
Function(double value, double topBuf, double topAdd) call;
Path path;
WorkView(this.item) {} WorkView(this.item, this.call) {}
Paint ImagePaint = new Paint()..isAntiAlias = true; Paint ImagePaint = new Paint()..isAntiAlias = true;
Paint linePaint = new Paint() Paint linePaint = new Paint()
..isAntiAlias = true ..isAntiAlias = true
...@@ -71,28 +33,43 @@ class WorkView extends CustomPainter { ...@@ -71,28 +33,43 @@ class WorkView extends CustomPainter {
..color = Colors.black38 ..color = Colors.black38
..style = PaintingStyle.fill; ..style = PaintingStyle.fill;
Paint circlePaint = new Paint()
..isAntiAlias = true
..color = Colors.redAccent
..style = PaintingStyle.fill;
Paint rectPaint = new Paint()
..isAntiAlias = true
..color = Colors.blue
..style = PaintingStyle.stroke
..strokeWidth = 2;
@override @override
void paint(Canvas canvas, Size size) { void paint(Canvas canvas, Size size) {
if (item.scareSize != 1) {
canvas.scale(item.scareSize, item.scareSize);
}
if (item.tranX != 0 || item.tranY != 0) { if (item.tranX != 0 || item.tranY != 0) {
if (item.tranX / item.scareSize > size.width) { if (item.tranX + size.width / item.scareSize > size.width) {
item.tranX = size.width * item.scareSize; item.tranX = size.width - size.width / item.scareSize;
} }
if (item.tranY / item.scareSize > size.height) { if (item.tranY + size.height / item.scareSize > size.height) {
item.tranY = size.height * item.scareSize; item.tranY = size.height - size.height / item.scareSize;
} }
canvas.translate(-item.tranX, -item.tranY); canvas.translate(-item.tranX, -item.tranY);
} }
if (item.scareSize != 1) {
canvas.scale(item.scareSize, item.scareSize);
}
if (item.getImage() != null) { if (item.getImage() != null) {
double scareSize = item.getImage().width / size.width; double scareSize = item.getImage().width / size.width;
double showWidth = size.width; double showWidth = size.width;
double showheight = item.getImage().height / scareSize; double showheight = item.getImage().height / scareSize;
double top;
if (showheight > size.height) { if (showheight > size.height) {
showheight = size.height; // showheight = size.height;
} // top=(showheight-size.height)/2;
double top = (size.height - showheight) / 2; } else {}
top = (size.height - showheight) / 2;
call(scareSize, top, (size.height - showheight) / 2);
canvas.drawImageRect( canvas.drawImageRect(
item.getImage(), item.getImage(),
Rect.fromLTWH(0.0, 0.0, item.getImage().width.toDouble(), Rect.fromLTWH(0.0, 0.0, item.getImage().width.toDouble(),
...@@ -100,8 +77,11 @@ class WorkView extends CustomPainter { ...@@ -100,8 +77,11 @@ class WorkView extends CustomPainter {
Rect.fromLTWH(0, top, showWidth, showheight), Rect.fromLTWH(0, top, showWidth, showheight),
ImagePaint); ImagePaint);
} }
double newX = (item.getX() + item.getTranX()) / item.scareSize; // double newX = (item.getX() + item.getTranX()) / item.scareSize;
double newY = (item.getY() + item.getTranY()) / item.scareSize; double newX = (item.getX() / item.scareSize + item.getTranX());
// double newY = (item.getY() + item.getTranY()) / item.scareSize;
double newY = (item.getY() / item.scareSize + item.getTranY());
if (item.getX() != null && if (item.getX() != null &&
item.getY() != null && item.getY() != null &&
item.getX() >= 0 && item.getX() >= 0 &&
...@@ -120,37 +100,38 @@ class WorkView extends CustomPainter { ...@@ -120,37 +100,38 @@ class WorkView extends CustomPainter {
..layout(maxWidth: 150, minWidth: 30) ..layout(maxWidth: 150, minWidth: 30)
..paint(canvas, Offset(newX + 5, newY - 20)); ..paint(canvas, Offset(newX + 5, newY - 20));
} }
if (item.getPoints().isNotEmpty) { if (item.rectModel) {
// if(item.getPoints().length==1){ canvas.drawRect(item.rect, rectPaint);
// canvas.drawPoints(pointMode, points, paint) canvas.drawRect(item.rect, pathPaint);
// }else if(item.getPoints().length==2){ canvas.drawCircle(Offset(item.rect.left, item.rect.top), 5, circlePaint);
// canvas.drawCircle(
// } else{ Offset(item.rect.right, item.rect.bottom), 5, circlePaint);
// for(int i=0;i<item.getPoints().length;i++){ } else {
// if(i==item.getPoints().length-1){ if (item.getPoints().isNotEmpty) {
// canvas.drawPoints(PointMode.polygon, item.getPoints(), pointPaint);
// }else{
//
// }
// }
// }
canvas.drawPoints(PointMode.polygon, item.getPoints(), pointPaint);
}
print("OK?? ${item.drawPath}");
if (item.drawPath) {
if (item.getPoints().length < 2) {
return;
} }
Path path = new Path(); if (item.drawPath) {
path.moveTo(item.getPoints()[0].dx, item.getPoints()[0].dy); if (item.getPoints().length < 2) {
for (int i = 0; i < item.getPoints().length; i++) { return;
path.lineTo(item.getPoints()[i].dx, item.getPoints()[i].dy); }
path = new Path();
path.moveTo(item.getPoints()[0].dx, item.getPoints()[0].dy);
for (int i = 0; i < item.getPoints().length; i++) {
path.lineTo(item.getPoints()[i].dx, item.getPoints()[i].dy);
}
path.close();
canvas.drawPath(path, pathPaint);
} }
path.close();
canvas.drawPath(path, pathPaint);
} }
} }
bool calutePath(Offset offset) {
if (path != null) {
return path.contains(offset);
}
return false;
}
@override @override
bool shouldRepaint(CustomPainter oldDelegate) { bool shouldRepaint(CustomPainter oldDelegate) {
return true; return true;
......
...@@ -21,6 +21,8 @@ import 'package:flutter/material.dart'; ...@@ -21,6 +21,8 @@ import 'package:flutter/material.dart';
import 'package:flutter_animation_set/animator.dart'; import 'package:flutter_animation_set/animator.dart';
class WorkModel extends BaseModel { class WorkModel extends BaseModel {
LiveData<bool> rectMaskLive = new LiveData();
LiveData<String> maskTabLive = new LiveData();
LiveData<PointItem> pointLive = new LiveData(); LiveData<PointItem> pointLive = new LiveData();
LiveData<List<int>> nowIndexLive = new LiveData(); LiveData<List<int>> nowIndexLive = new LiveData();
LiveData<Map<String, List<List<String>>>> selectLive = new LiveData(); LiveData<Map<String, List<List<String>>>> selectLive = new LiveData();
...@@ -403,6 +405,8 @@ class WorkModel extends BaseModel { ...@@ -403,6 +405,8 @@ class WorkModel extends BaseModel {
@override @override
void dispose() { void dispose() {
rectMaskLive.dispost();
maskTabLive.dispost();
pointLive.dispost(); pointLive.dispost();
nowIndexLive.dispost(); nowIndexLive.dispost();
tabLive.dispost(); tabLive.dispost();
...@@ -565,20 +569,89 @@ class WorkModel extends BaseModel { ...@@ -565,20 +569,89 @@ class WorkModel extends BaseModel {
}); });
} }
void saveDrawImage(
BuildContext context, double picScare, double topBuf, double topAdd) {
if (maskTabLive.data == null) {
Toast.show(context, "得选着一个标签哦");
return;
}
print("SCARE ===== >>>>> $picScare");
if (pointItem.list.isEmpty) {
Toast.show(context, "还没有标记数据哦~");
return;
}
BaseCenterPicker()
..setPicker(BaseLoadingItem("保存中..."))
..show(context);
List<int> uploadList = [];
pointItem.list.forEach((off) {
uploadList.add((off.dx * picScare).toInt());
if (topAdd > 0) {
uploadList.add(((off.dy + topAdd) * picScare).toInt());
} else {
uploadList.add(((off.dy - topBuf) * picScare).toInt());
}
});
if (uploadList.isNotEmpty) {
getTempDirX(context, (dir) {
var savePath = "${dir}/${DateTime.now().millisecondsSinceEpoch}.jpeg";
DioUtil()
.getDio()
.download(_repo.getCurrentPageList()[currentIndex].picurl, savePath)
.whenComplete(() {
String uploadPath =
"${dir}/sign${DateTime.now().millisecondsSinceEpoch}.jpeg";
toImage(uploadList, uploadPath, savePath).whenComplete(() {
File(savePath).delete();
HomeRepo.getInstance()
.maskImage(uploadPath, imageId, maskExplain[maskTabLive.data],
listToUi(pointItem.list))
.listen((value) {
if (value != null) {
Toast.show(context, "保存成功");
Navigator.pop(context);
File(uploadPath).delete();
Navigator.pop(context);
}
}).onError((error) {
Toast.show(context, error.toString());
print(error.toString());
Navigator.pop(context);
});
// String realUploadPath =
// "${dir}/mask${DateTime.now().millisecondsSinceEpoch}.png";
// opencvMethod(uploadPath, realUploadPath).whenComplete(() {
// print("!!!!!!!! ${uploadPath} ${realUploadPath}");
// Navigator.pop(context);
// }).catchError((error) {
// print(error.toString());
// });
}).catchError((error) {
Navigator.pop(context);
Toast.show(context, "保存失败");
print(error.toString());
});
});
});
}
}
void saveImage(BuildContext context) { void saveImage(BuildContext context) {
Toast.show(context, "开始保存图片"); Toast.show(context, "开始保存");
getTempDir().then((value) { getTempDir().then((value) {
if (value != null) { if (value != null) {
print(value); print(value);
DioUtil().getDio().download(_repo.getCurrentPageList()[currentIndex].picurl, var savePath = "${value}/${DateTime.now().millisecondsSinceEpoch}.jpeg";
"${value}/${DateTime.now().millisecondsSinceEpoch}.jpeg", DioUtil()
onReceiveProgress: (int count, int total) { .getDio()
.download(_repo.getCurrentPageList()[currentIndex].picurl, savePath,
onReceiveProgress: (int count, int total) {
//进度 //进度
// Toast.show(context, "进度!! $count $total"); // Toast.show(context, "进度!! $count $total");
print("进度!! $count $total"); print("进度!! $count $total");
}).then((value) { }).then((value) {
Toast.show(context, "下载完成"); Toast.show(context, "下载完成");
print("OKKK "); print("OKKK " + savePath);
openCachce(); openCachce();
}).catchError((error) { }).catchError((error) {
Toast.show(context, error.toString()); Toast.show(context, error.toString());
...@@ -595,7 +668,9 @@ class WorkModel extends BaseModel { ...@@ -595,7 +668,9 @@ class WorkModel extends BaseModel {
} }
void getNetWorkImg(BuildContext context) { void getNetWorkImg(BuildContext context) {
loadNetWorkImage(_repo.getCurrentPageList()[currentIndex].picurl).then((value) { rectMaskLive.notifyView(pointItem.rectModel);
loadNetWorkImage(_repo.getCurrentPageList()[currentIndex].picurl)
.then((value) {
pointItem.reset(); pointItem.reset();
pointItem.setImage(value); pointItem.setImage(value);
pointLive.notifyView(pointItem); pointLive.notifyView(pointItem);
...@@ -608,6 +683,49 @@ class WorkModel extends BaseModel { ...@@ -608,6 +683,49 @@ class WorkModel extends BaseModel {
void syncPoint() { void syncPoint() {
pointLive.notifyView(pointItem); pointLive.notifyView(pointItem);
} }
void showMaskTabSelect(BuildContext context) {
showModalBottomSheet(
context: context,
builder: (BuildContext context) {
List<Widget> list = new List();
maskTabList.forEach((value) {
list.add(new ListTile(
leading: new Icon(Icons.select_all),
title: new Text(value),
onTap: () async {
Navigator.pop(context);
maskTabLive.notifyView(value);
},
));
});
return new Column(mainAxisSize: MainAxisSize.min, children: list);
});
}
void getMaskedImage(BuildContext context) {
if (maskTabLive.data == null) {
Toast.show(context, "还没有选中标签哦~");
return;
}
BaseCenterPicker()
..setPicker(BaseLoadingItem("加载中..."))
..show(context);
HomeRepo.getInstance()
.getMaskInfo(imageId, maskExplain[maskTabLive.data])
.listen((value) {
if (value != null && value.ui != null && value.ui.isNotEmpty) {
pointItem.list = uiToList(value.ui);
pointItem.drawPath = true;
syncPoint();
}
Navigator.pop(context);
}).onError((error) {
Toast.show(context, error.toString());
print(error.toString());
Navigator.pop(context);
});
}
} }
class SurePicker implements ICenterPicker { class SurePicker implements ICenterPicker {
......
This diff is collapsed.
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
* @date 2019-11-14 * @date 2019-11-14
**/ **/
import 'package:flutter/cupertino.dart';
const String TEST_IMAGES = """ const String TEST_IMAGES = """
{ {
"pic_list": [ "pic_list": [
...@@ -265,3 +267,33 @@ const Map<String, String> EXPLAN = { ...@@ -265,3 +267,33 @@ const Map<String, String> EXPLAN = {
"brows_spacing": "两眉间距", "brows_spacing": "两眉间距",
"face": "脸型", "face": "脸型",
}; };
const List<String> maskTabList = ["左双眼皮", "右双眼皮"];
const Map<String, String> maskExplain = {
"左双眼皮": "left_eyelid",
"右双眼皮": "right_eyelid"
};
List<Offset> uiToList(String string) {
var split = string.split(":");
List<Offset> list = [];
for (int i = 0; i < split.length; i += 2) {
list.add(Offset(
int.parse(split[i]).toDouble(), int.parse(split[i + 1]).toDouble()));
}
return list;
}
String listToUi(List<Offset> list) {
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < list.length; i++) {
stringBuffer.write("${list[i].dx.toInt()}");
stringBuffer.write(":");
stringBuffer.write("${list[i].dy.toInt()}");
if (i != list.length - 1) {
stringBuffer.write(":");
}
}
return stringBuffer.toString();
}
...@@ -3,13 +3,16 @@ ...@@ -3,13 +3,16 @@
* @date 2019-11-07 * @date 2019-11-07
**/ **/
import 'dart:convert'; import 'dart:convert';
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:example_flutter/HomeModel/page/work/temp.dart'; import 'package:example_flutter/HomeModel/page/work/temp.dart';
import 'package:example_flutter/HomeModel/service/remote/api/HomeApi.serv.dart'; import 'package:example_flutter/HomeModel/service/remote/api/HomeApi.serv.dart';
import 'package:example_flutter/HomeModel/service/remote/entity/AllTabBean.dart'; import 'package:example_flutter/HomeModel/service/remote/entity/AllTabBean.dart';
import 'package:example_flutter/HomeModel/service/remote/entity/DeleteResultBean.dart'; import 'package:example_flutter/HomeModel/service/remote/entity/DeleteResultBean.dart';
import 'package:example_flutter/HomeModel/service/remote/entity/ImageAiBean.dart'; import 'package:example_flutter/HomeModel/service/remote/entity/ImageAiBean.dart';
import 'package:example_flutter/HomeModel/service/remote/entity/ImageResultBean.dart'; import 'package:example_flutter/HomeModel/service/remote/entity/ImageResultBean.dart';
import 'package:example_flutter/HomeModel/service/remote/entity/MaskResultBean.dart';
import 'package:example_flutter/HomeModel/service/remote/entity/PutImageDataBean.dart'; import 'package:example_flutter/HomeModel/service/remote/entity/PutImageDataBean.dart';
import 'package:example_flutter/HomeModel/service/remote/entity/TotalImageBean.dart'; import 'package:example_flutter/HomeModel/service/remote/entity/TotalImageBean.dart';
import 'package:example_flutter/HomeModel/service/remote/entity/UploadResultBean.dart'; import 'package:example_flutter/HomeModel/service/remote/entity/UploadResultBean.dart';
...@@ -87,8 +90,45 @@ class HomeRepo { ...@@ -87,8 +90,45 @@ class HomeRepo {
.flatMap((value) { .flatMap((value) {
if (value != null && if (value != null &&
(value.statusCode >= 200 && value.statusCode < 300)) { (value.statusCode >= 200 && value.statusCode < 300)) {
return Observable.fromFuture(compute(parsePutImageBean, value.toString())); return Observable.fromFuture(
compute(parsePutImageBean, value.toString()));
} else {
return Observable.fromFuture(null);
}
});
}
Observable<MaskResultBean> maskImage(
String path, int id, String tag, String ui) {
var name = path.substring(path.lastIndexOf("/") + 1, path.length);
FormData formData = new FormData.from({
"file": new UploadFileInfo(new File(path), name),
"tag": tag,
"ui": ui
});
return Observable.fromFuture(DioUtil.getInstance()
.getDio()
.post('maskimages/${id}/', data: formData))
.flatMap((value) {
if (value != null &&
(value.statusCode >= 200 && value.statusCode < 300)) {
return Observable.fromFuture(
compute(parseMaskResult, value.toString()));
} else {
return Observable.fromFuture(null);
}
});
}
Observable<MaskResultBean> getMaskInfo(int id, String tag) {
return Observable.fromFuture(DioUtil.getInstance()
.getDio()
.get('maskimages/${id}/', queryParameters: {"tag": tag}))
.flatMap((value) {
if (value != null &&
(value.statusCode >= 200 && value.statusCode < 300)) {
return Observable.fromFuture(
compute(parseMaskResult, value.toString()));
} else { } else {
return Observable.fromFuture(null); return Observable.fromFuture(null);
} }
...@@ -101,7 +141,8 @@ class HomeRepo { ...@@ -101,7 +141,8 @@ class HomeRepo {
.flatMap((value) { .flatMap((value) {
if (value != null && if (value != null &&
(value.statusCode >= 200 && value.statusCode < 300)) { (value.statusCode >= 200 && value.statusCode < 300)) {
return Observable.fromFuture(compute(parseDeleteResult, value.toString())); return Observable.fromFuture(
compute(parseDeleteResult, value.toString()));
} else { } else {
return Observable.fromFuture(null); return Observable.fromFuture(null);
} }
...@@ -123,6 +164,10 @@ DeleteResultBean parseDeleteResult(String value) { ...@@ -123,6 +164,10 @@ DeleteResultBean parseDeleteResult(String value) {
return DeleteResultBean.fromJson(json.decode(value)); return DeleteResultBean.fromJson(json.decode(value));
} }
PutImageDataBean parsePutImageBean(String value){ PutImageDataBean parsePutImageBean(String value) {
return PutImageDataBean.fromJson(json.decode(value)); return PutImageDataBean.fromJson(json.decode(value));
} }
MaskResultBean parseMaskResult(String value) {
return MaskResultBean.fromJson(json.decode(value));
}
/*
* @author lsy
* @date 2019-11-27
**/
class MaskResultBean {
String picurl;
int otherid;
String tag;
String ui;
MaskResultBean({this.picurl, this.otherid, this.tag, this.ui});
MaskResultBean.fromJson(Map<String, dynamic> json) {
picurl = json['picurl'];
otherid = json['otherid'];
tag = json['tag'];
ui = json['ui'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['picurl'] = this.picurl;
data['otherid'] = this.otherid;
data['tag'] = this.tag;
data['ui'] = this.ui;
return data;
}
}
\ No newline at end of file
...@@ -46,6 +46,7 @@ class LoginState extends State<LoginPage> { ...@@ -46,6 +46,7 @@ class LoginState extends State<LoginPage> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
body: Stack( body: Stack(
alignment : AlignmentDirectional.topCenter,
children: <Widget>[ children: <Widget>[
ConstrainedBox( ConstrainedBox(
constraints: BoxConstraints.expand(), constraints: BoxConstraints.expand(),
...@@ -56,7 +57,23 @@ class LoginState extends State<LoginPage> { ...@@ -56,7 +57,23 @@ class LoginState extends State<LoginPage> {
fit: BoxFit.cover, fit: BoxFit.cover,
)), )),
), ),
main() main(),
// Positioned(
// child: Container(
// height: 60,
// alignment: Alignment.center,
// child: FlatButton(
// onPressed: (){
// openCachce();
// },
// child: Container(
// padding: EdgeInsets.all(10),
// color: Colors.black,
// child: baseText("请把opencv.sh 和 opencv.py 移动到打开的目标文件夹下!! 点我打开目标文件夹", 15, Colors.redAccent),
// ),
// ),
// ),
// ),
], ],
)); ));
} }
......
...@@ -3,19 +3,44 @@ ...@@ -3,19 +3,44 @@
* @date 2019-10-13 * @date 2019-10-13
**/ **/
import 'package:example_flutter/commonModel/toast/toast.dart';
import 'package:example_flutter/res/value/ALColors.dart'; import 'package:example_flutter/res/value/ALColors.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
MethodChannel channel=new MethodChannel("plugins.flutter.io/path_provider"); MethodChannel channel = new MethodChannel("plugins.flutter.io/path_provider");
MethodChannel opencv = new MethodChannel("lsyyy");
Future getTempDir(){ Future getTempDir() {
return channel.invokeMethod("getTemporaryDirectory"); return channel.invokeMethod("getTemporaryDirectory");
} }
Future openCachce(){ void getTempDirX(BuildContext context, Function(String dir) f) {
getTempDir().then((value) {
f(value);
}).catchError((error) {
Toast.show(context, error.toString());
print(error.toString());
});
}
Future<String> toImage(List<int> arr, String path, String needPath) {
return channel.invokeMethod(
"toImage", {"path": path, "list": arr, "needPath": needPath});
}
Future<String> opencvMethod(String readPath, String writePath) {
return channel.invokeMethod("opencvImg", [readPath, writePath]);
}
Future<String> toImageTest(List<int> arr, String path, String needPath) {
return channel.invokeMethod(
"toImageTest", {"path": path, "list": arr, "needPath": needPath});
}
Future openCachce() {
return channel.invokeMethod("openCache"); return channel.invokeMethod("openCache");
} }
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
// limitations under the License. // limitations under the License.
import 'package:example_flutter/Annotations/RouterCenterRestore.mark.dart'; import 'package:example_flutter/Annotations/RouterCenterRestore.mark.dart';
import 'package:example_flutter/commonModel/base/BaseComponent.dart';
import 'package:flutter/foundation.dart' import 'package:flutter/foundation.dart'
show debugDefaultTargetPlatformOverride; show debugDefaultTargetPlatformOverride;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
...@@ -31,7 +32,7 @@ class MyApp extends StatelessWidget { ...@@ -31,7 +32,7 @@ class MyApp extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MaterialApp( return MaterialApp(
showSemanticsDebugger: false, showSemanticsDebugger: false,
title: 'Flutter Demo', title: 'Flutter Demo',
theme: ThemeData( theme: ThemeData(
primarySwatch: Colors.blue, primarySwatch: Colors.blue,
......
This diff is collapsed.
////
//// Cv.h
//// Runner
////
//// Created by Apple on 2019/11/26.
//// Copyright © 2019 Google LLC. All rights reserved.
////
//
//#ifndef Cv_h
//#define Cv_h
//
//
//#endif /* Cv_h */
//
//
////
//// NSImage+OpenCV.h
////
//// Created by TangQiao on 12-10-26.
////
//
//#import <Foundation/Foundation.h>
//#import "opencv2/opencv.hpp"
//
//@interface CV (OpenCV)
//
//+(NSImage*)imageWithCVMat:(const cv::Mat&)cvMat;
//-(id)initWithCVMat:(const cv::Mat&)cvMat;
//
//@property(nonatomic, readonly) cv::Mat CVMat;
//@property(nonatomic, readonly) cv::Mat CVGrayscaleMat;
//
//@end
////
//// Cv.m
//// Runner
////
//// Created by Apple on 2019/11/26.
//// Copyright © 2019 Google LLC. All rights reserved.
////
//
//#import <Foundation/Foundation.h>
////
//// NSImage+OpenCV.mm
////
//// Created by TangQiao on 12-10-26.
////
//
//#import "Cv.h"
//
//static void ProviderReleaseDataNOP(void *info, const void *data, size_t size)
//{
// return;
//}
//
//
//@implementation Cv (OpenCV)
//
//-(CGImageRef)CGImage
//{
// CGContextRef bitmapCtx = CGBitmapContextCreate(NULL/*data - pass NULL to let CG allocate the memory*/,
// [self size].width,
// [self size].height,
// 8 /*bitsPerComponent*/,
// 0 /*bytesPerRow - CG will calculate it for you if it's allocating the data. This might get padded out a bit for better alignment*/,
// [[NSColorSpace genericRGBColorSpace] CGColorSpace],
// kCGBitmapByteOrder32Host|kCGImageAlphaPremultipliedFirst);
//
// [NSGraphicsContext saveGraphicsState];
// [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithGraphicsPort:bitmapCtx flipped:NO]];
// [self drawInRect:NSMakeRect(0,0, [self size].width, [self size].height) fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0];
// [NSGraphicsContext restoreGraphicsState];
//
// CGImageRef cgImage = CGBitmapContextCreateImage(bitmapCtx);
// CGContextRelease(bitmapCtx);
//
// return cgImage;
//}
//
//
//-(cv::Mat)CVMat
//{
// CGImageRef imageRef = [self CGImage];
// CGColorSpaceRef colorSpace = CGImageGetColorSpace(imageRef);
// CGFloat cols = self.size.width;
// CGFloat rows = self.size.height;
// cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels
//
// CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to backing data
// cols, // Width of bitmap
// rows, // Height of bitmap
// 8, // Bits per component
// cvMat.step[0], // Bytes per row
// colorSpace, // Colorspace
// kCGImageAlphaNoneSkipLast |
// kCGBitmapByteOrderDefault); // Bitmap info flags
//
// CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), imageRef);
// CGContextRelease(contextRef);
// CGImageRelease(imageRef);
// return cvMat;
//}
//
//-(cv::Mat)CVGrayscaleMat
//{
// CGImageRef imageRef = [self CGImage];
// CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
// CGFloat cols = self.size.width;
// CGFloat rows = self.size.height;
// cv::Mat cvMat = cv::Mat(rows, cols, CV_8UC1); // 8 bits per component, 1 channel
// CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to backing data
// cols, // Width of bitmap
// rows, // Height of bitmap
// 8, // Bits per component
// cvMat.step[0], // Bytes per row
// colorSpace, // Colorspace
// kCGImageAlphaNone |
// kCGBitmapByteOrderDefault); // Bitmap info flags
//
// CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), imageRef);
// CGContextRelease(contextRef);
// CGColorSpaceRelease(colorSpace);
// CGImageRelease(imageRef);
// return cvMat;
//}
//
//+ (NSImage *)imageWithCVMat:(const cv::Mat&)cvMat
//{
// return [[[NSImage alloc] initWithCVMat:cvMat] autorelease];
//}
//
//- (id)initWithCVMat:(const cv::Mat&)cvMat
//{
// NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize() * cvMat.total()];
//
// CGColorSpaceRef colorSpace;
//
// if (cvMat.elemSize() == 1)
// {
// colorSpace = CGColorSpaceCreateDeviceGray();
// }
// else
// {
// colorSpace = CGColorSpaceCreateDeviceRGB();
// }
//
// CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);
//
// CGImageRef imageRef = CGImageCreate(cvMat.cols, // Width
// cvMat.rows, // Height
// 8, // Bits per component
// 8 * cvMat.elemSize(), // Bits per pixel
// cvMat.step[0], // Bytes per row
// colorSpace, // Colorspace
// kCGImageAlphaNone | kCGBitmapByteOrderDefault, // Bitmap info flags
// provider, // CGDataProviderRef
// NULL, // Decode
// false, // Should interpolate
// kCGRenderingIntentDefault); // Intent
//
//
// NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:imageRef];
// NSImage *image = [[NSImage alloc] init];
// [image addRepresentation:bitmapRep];
//
// CGImageRelease(imageRef);
// CGDataProviderRelease(provider);
// CGColorSpaceRelease(colorSpace);
//
// return image;
//}
//
//@end
...@@ -2,31 +2,33 @@ import Cocoa ...@@ -2,31 +2,33 @@ import Cocoa
import FlutterMacOS import FlutterMacOS
class MainFlutterWindow: NSWindow { class MainFlutterWindow: NSWindow {
override func awakeFromNib() {
let flutterViewController = FlutterViewController.init()
let windowFrame = self.frame
self.contentViewController = flutterViewController
self.setFrame(windowFrame, display: true)
// guard let controller = flutterViewController as? FlutterPluginRegistrar else {
// fatalError("rootViewController is not type FlutterViewController")
// }
//
// let batteryChannel = FlutterMethodChannel(name:"GM_Desktop",
// binaryMessenger: controller.messenger)
//
// batteryChannel.setMethodCallHandler({
// [weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in
// guard call.method == "getBatteryLevel" else {
// result(FlutterMethodNotImplemented)
// return
// }
// self?.receiveBatteryLevel(result: result)
// })
RegisterGeneratedPlugins(registry: flutterViewController) override func awakeFromNib() {
let flutterViewController = FlutterViewController.init()
let windowFrame = self.frame
self.contentViewController = flutterViewController
self.setFrame(windowFrame, display: true)
// guard let controller = flutterViewController as? FlutterPluginRegistrar else {
// fatalError("rootViewController is not type FlutterViewController")
// }
//
// let batteryChannel = FlutterMethodChannel(name:"GM_Desktop",
// binaryMessenger: controller.messenger)
//
// batteryChannel.setMethodCallHandler({
// [weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in
// guard call.method == "getBatteryLevel" else {
// result(FlutterMethodNotImplemented)
// return
// }
// self?.receiveBatteryLevel(result: result)
// })
RegisterGeneratedPlugins(registry: flutterViewController)
super.awakeFromNib()
}
super.awakeFromNib()
}
} }
//
// MyPlugin.swift
// Runner
//
// Created by Apple on 2019/11/26.
// Copyright © 2019 Google LLC. All rights reserved.
//
import Foundation
import FlutterMacOS
import Foundation
import Cocoa
public class MyPlugin: NSObject, FlutterPlugin {
public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(
name: "lsyyy",
binaryMessenger: registrar.messenger)
let instance = MyPlugin()
registrar.addMethodCallDelegate(instance, channel: channel)
}
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
switch call.method {
case "opencv":
result("o98k")
default:
result("not impl")
}
}
}
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment