Search code examples
flutterdartflutter-dependencies

Is it possible to create image from Text in Flutter?


I am working on an app where users can log into the app and can enter text in a text form field. It can also apply different font styles and font families and generate an image from it.

Is it possible to achieve?

Any help would be highly appreciated


Solution

  • Here is an example for you. You can test it in an app.
    It draw the text to a canvas then save canvas as an image. So you can apply any font style to ParagraphBuilder.

    I hope it helps

    class MyHomePage extends StatefulWidget {
      const MyHomePage({super.key, required this.title});
    
      final String title;
    
      @override
      State<MyHomePage> createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      TextEditingController controller = TextEditingController();
      Image? img;
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: <Widget>[
                TextFormField(
                  controller: controller,
                ),
                ElevatedButton(onPressed: _onPressedButton, child: const Text("Create Image")),
                Container(width: 200, height: 200, color: Colors.blueGrey, child: img ?? Container())
              ],
            ),
          ),
        );
      }
    
      void getCanvasImage(String str) async {
        var builder = ParagraphBuilder(ParagraphStyle(fontStyle: FontStyle.normal));
        builder.addText(str);
        Paragraph paragraph = builder.build();
        paragraph.layout(const ParagraphConstraints(width: 100));
    
        final recorder = PictureRecorder();
        var newCanvas = Canvas(recorder);
    
        newCanvas.drawParagraph(paragraph, Offset.zero);
    
        final picture = recorder.endRecording();
        var res = await picture.toImage(100, 100);
        ByteData? data = await res.toByteData(format: ImageByteFormat.png);
    
        if (data != null) {
          img = Image.memory(Uint8List.view(data.buffer));
        }
    
        setState(() {});
      }
    
      void _onPressedButton() {
        getCanvasImage(controller.text);
      }
    }