我想在Flutter Image.drawString中使用自定义字体大小

问题描述 投票:0回答:1

这是关于Flutter、Dart、Image,特别是drawString函数。

首先,我想做的是用文字(产品名称)为拍摄的图片添加水印。我的意思是不仅仅是将文本放在图像上,而是实际上将其与图片合并,以便用户可以提交图片并在共享产品时共享它。

这样做。我找到了正确的函数drawString(),但问题是它只支持arial48、arial24和arial14字体大小。由于我必须以自定义字体大小编写产品名称,因此我通过计算原始图像的宽度和高度来提取该名称。有没有人以前尝试过这一点或者任何人可以使其成为可能。有谁知道吗

我已经尝试过了。

import 'package:image/image.dart' as img;

img.drawString(originalImage,'$myProductName($pictureTag)',
        x: value,
        y: value,
        color: img.ColorFloat32.rgb(255,255,255), font: img.arial48,
    );

但是我需要使用自定义字体大小而不是这些预定义的大小。

我使用的是flutter:3.19.0版本。 和 图片:^4.1.7

flutter image drawing drawstring font-rendering
1个回答
0
投票

请检查一下,这是我针对此问题的解决方案:

import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:image/image.dart' as img;

class WatermarkImage extends StatelessWidget {
  final String imagePath;
  final String productName;
  final double fontSize;

  WatermarkImage({
    required this.imagePath,
    required this.productName,
    required this.fontSize,
  });

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<Uint8List>(
      future: _generateWatermarkedImage(),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return CircularProgressIndicator();
        } else if (snapshot.hasError) {
          return Text('Error: ${snapshot.error}');
        } else {
          return Image.memory(snapshot.data!);
        }
      },
    );
  }

  Future<Uint8List> _generateWatermarkedImage() async {
    final originalImage = img.decodeImage(await _loadImage());
    final scaledImage = img.copyResize(originalImage!, width: originalImage.width, height: originalImage.height);

    img.drawString(scaledImage, productName,
        x: 10,
        y: 10,
        color: img.Color.fromRgb(255, 255, 255),
        font: img.arial48);

    return Uint8List.fromList(img.encodePng(scaledImage));
  }

  Future<Uint8List> _loadImage() async {
    // Load image from file path
    final file = File(imagePath);
    return await file.readAsBytes();
  }
}

void main() {
  runApp(MaterialApp(
    home: Scaffold(
      body: Center(
        child: WatermarkImage(
          imagePath: 'path_to_your_image.jpg',
          productName: 'Your Product Name',
          fontSize: 36.0, // Custom font size
        ),
      ),
    ),
  ));
}
© www.soinside.com 2019 - 2024. All rights reserved.