如何解决Flutter Uint8List从Painter的Png解码为Image.memory
我用热敏打印机打印功能创建了一个Painter,但是我无法将字节Uint8List解码回Png,我可以将Paint File作为String(Uint8List-Bytes)打印,但我想先绘制并打印它。我该如何打印我的油漆设计到热敏打印机? 谢谢大家!
import 'dart:ui';
import 'package:esc_pos_utils/esc_pos_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:painter2/painter2.dart';
import 'dart:typed_data';
import 'package:flutter_colorpicker/flutter_colorpicker.dart';
import 'esc_pos_printer.dart';
void KagidaYaz() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Painter2 Example',home: ExamplePage(),);
}
}
class ExamplePage extends StatefulWidget {
@override
_ExamplePageState createState() => _ExamplePageState();
}
class _ExamplePageState extends State<ExamplePage> {
bool _finished;
PainterController _controller;
String bytes2;
@override
void initState() {
super.initState();
_finished = false;
_controller = newController();
final PrinterNetworkManager printerManager = PrinterNetworkManager();
// To discover network printers in your subnet,consider using
// ping_discover_network package (https://pub.dev/packages/ping_discover_network).
// Note that most of ESC/POS printers are available on port 9100 by default.
printerManager.selectPrinter('192.168.178.10',port: 9100);
}
PainterController newController() {
PainterController controller = PainterController();
controller.thickness = 2.0;
controller.backgroundColor = Colors.white;
//controller.backgroundImage = Image.network(
// 'https://cdn-images-1.medium.com/max/1200/1*5-aoK8IBmXve5whBQM90GA.png');
return controller;
}
@override
Widget build(BuildContext context) {
List<Widget> actions;
if (_finished) {
actions = <Widget>[
IconButton(
icon: Icon(Icons.content_copy),tooltip: 'New Painting',onPressed: () => setState(() {
_finished = false;
_controller = newController();
}),),];
} else {
actions = <Widget>[
IconButton(
icon: Icon(Icons.undo),tooltip: 'Undo',onPressed: () {
if (_controller.canUndo) _controller.undo();
},IconButton(
icon: Icon(Icons.redo),tooltip: 'Redo',onPressed: () {
if (_controller.canRedo) _controller.redo();
},IconButton(
icon: Icon(Icons.delete),tooltip: 'Clear',onPressed: () => _controller.clear(),IconButton(
icon: Icon(Icons.check),onPressed: () async {
setState(() {
_finished = true;
});
Uint8List bytes = await _controller.exportAsPNGBytes();
bytes2 = bytes.toString();
ipDeneme2(this.bytes2);
Navigator.of(context)
.push(MaterialPageRoute(builder: (BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Siparisi Gör'),body: Container(
child: Image.memory(bytes),);
}));
}),];
}
return Scaffold(
appBar: AppBar(
title: Text('Painter2 Example'),actions: actions,bottom: PreferredSize(
child: DrawBar(_controller),preferredSize: Size(MediaQuery.of(context).size.width,30.0),)),body: Center(
child: AspectRatio(aspectRatio: 1.0,child: Painter(_controller))),);
}
}
class DrawBar extends StatelessWidget {
final PainterController _controller;
DrawBar(this._controller);
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[
Flexible(child: StatefulBuilder(
builder: (BuildContext context,StateSetter setState) {
return Container(
child: Slider(
value: _controller.thickness,onChanged: (value) => setState(() {
_controller.thickness = value;
}),min: 1.0,max: 20.0,activeColor: Colors.white,));
})),ColorPickerButton(_controller,false),true),],);
}
}
class ColorPickerButton extends StatefulWidget {
final PainterController _controller;
final bool _background;
ColorPickerButton(this._controller,this._background);
@override
_ColorPickerButtonState createState() => new _ColorPickerButtonState();
}
class _ColorPickerButtonState extends State<ColorPickerButton> {
@override
Widget build(BuildContext context) {
return IconButton(
icon: Icon(_iconData,color: _color),tooltip:
widget._background ? 'Change background color' : 'Change draw color',onPressed: () => _pickColor(),);
}
void _pickColor() {
Color pickerColor = _color;
Navigator.of(context)
.push(MaterialPageRoute(
fullscreenDialog: true,builder: (BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Pick color'),body: Container(
alignment: Alignment.center,child: ColorPicker(
pickerColor: pickerColor,onColorChanged: (Color c) => pickerColor = c,)));
}))
.then((_) {
setState(() {
_color = pickerColor;
});
});
}
Color get _color => widget._background
? widget._controller.backgroundColor
: widget._controller.drawColor;
IconData get _iconData =>
widget._background ? Icons.format_color_fill : Icons.brush;
set _color(Color color) {
if (widget._background) {
widget._controller.backgroundColor = color;
} else {
widget._controller.drawColor = color;
}
}
}
void ipDeneme2(String bytes2) async {
final PrinterNetworkManager printerManager = PrinterNetworkManager();
// To discover network printers in your subnet,consider using
// ping_discover_network package (https://pub.dev/packages/ping_discover_network).
// Note that most of ESC/POS printers are available on port 9100 by default.
printerManager.selectPrinter('192.168.178.10',port: 9100);
final PosPrintResult res =
await printerManager.printTicket(await testTicket2(bytes2));
print('Print result: ${res.msg}');
}
Future<Ticket> testTicket2(String bytes2) async {
final profile = await CapabilityProfile.load();
final Ticket ticket = Ticket(PaperSize.mm80,profile);
//ticket.text("Arda Restaurant");
List<int> list = bytes2.codeUnits;
Uint8List bytes = Uint8List.fromList(list);
print(bytes);
//ticket.textEncoded(bytes);
//print(bytes);
//ticket.feed(10);
//ticket.cut();
return ticket;
}
我的Logcat输出为;
Launching lib/main.dart on SM N960F in debug mode...
Running Gradle task 'assembleDebug'...
✓ Built build/app/outputs/flutter-apk/app-debug.apk.
Installing build/app/outputs/flutter-apk/app.apk... 23,4s
Waiting for SM N960F to report its views...
I/Choreographer(17344): Skipped 32 frames! The application may be doing too much work on its main thread.
D/ViewRootImpl@969bd53[MainActivity](17344): Relayout returned: old=(0,720,1480) new=(0,1480) req=(720,1480)0 dur=18 res=0x1 s={true 532228255744} ch=false
D/ViewRootImpl@969bd53[MainActivity](17344): MSG_WINDOW_FOCUS_CHANGED 1 1
D/InputMethodManager(17344): prepareNavigationBarInfo() DecorView@dbb0cb7[MainActivity]
D/InputMethodManager(17344): getNavigationBarColor() -855310
D/InputMethodManager(17344): prepareNavigationBarInfo() DecorView@dbb0cb7[MainActivity]
D/InputMethodManager(17344): getNavigationBarColor() -855310
V/InputMethodManager(17344): Starting input: tba=com.kksio.kksitprobonsystem ic=null mNaviBarColor -855310 mIsGetNaviBarColorSuccess true,NavVisible : true,NavTrans : false
D/InputMethodManager(17344): startInputInner - Id : 0
I/InputMethodManager(17344): startInputInner - mService.startInputOrWindowGainedFocus
D/ViewRootImpl@969bd53[MainActivity](17344): MSG_RESIZED: frame=(0,1480) ci=(0,42,84) vi=(0,84) or=1
D/InputMethodManager(17344): prepareNavigationBarInfo() DecorView@dbb0cb7[MainActivity]
D/InputMethodManager(17344): getNavigationBarColor() -855310
V/InputMethodManager(17344): Starting input: tba=com.kksio.kksitprobonsystem ic=null mNaviBarColor -855310 mIsGetNaviBarColorSuccess true,NavTrans : false
D/InputMethodManager(17344): startInputInner - Id : 0
Debug service listening on ws://127.0.0.1:62630/hOGuYMeLYUo=/ws
Syncing files to device SM N960F...
D/ViewRootImpl@969bd53[MainActivity](17344): ViewPostIme pointer 0
D/ViewRootImpl@969bd53[MainActivity](17344): ViewPostIme pointer 1
D/ViewRootImpl@969bd53[MainActivity](17344): ViewPostIme pointer 0
D/ViewRootImpl@969bd53[MainActivity](17344): ViewPostIme pointer 1
D/ViewRootImpl@969bd53[MainActivity](17344): ViewPostIme pointer 0
D/ViewRootImpl@969bd53[MainActivity](17344): ViewPostIme pointer 1
I/flutter (17344): [91,49,51,55,44,32,56,48,50,54,53,52,53
I/flutter (17344): Print result: Success
D/InputMethodManager(17344): prepareNavigationBarInfo() DecorView@dbb0cb7[MainActivity]
D/InputMethodManager(17344): getNavigationBarColor() -855310
我尝试了所有事情,但是如果我将其添加到Flutter Image Package中,然后又遇到其他问题,则为所有解决方案加油!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。