【问题标题】:Generate image with A5 format with text on it using SkiaSharp or similar使用 SkiaSharp 或类似工具生成带有文本的 A5 格式图像
【发布时间】:2021-03-29 06:42:42
【问题描述】:

我的目标是生成 A5 格式的图像并在其上放置一些文本。在开始时,我试图使用System.Drawing.Imaging 来实现这一点,但似乎Xamarin 无法使用它。然后我发现SkiaSharp 库似乎可以有效地完成这项工作,但我在这里有点迷路。我怎样才能正确generate an image,在上面放一些文字并通过Stream发送。请注意,如果单个 A5 上无法容纳更多文本,则应创建下一个图像。

这是我目前得到的:

private void CreateBitmapFromText(List<string> texts)
{
     using var surface = SKSurface.Create(width: 640, height: 480, SKColorType.Gray8, SKAlphaType.Premul);
     SKCanvas myCanvas = surface.Canvas;

     // clear the canvas / fill with white
     myCanvas.DrawColor(SKColors.White);

     // set up drawing tools
     using (var paint = new SKPaint())
     {
           paint.TextSize = 64.0f;
           paint.IsAntialias = true;
           paint.Color = new SKColor(0x42, 0x81, 0xA4);
           paint.IsStroke = false;

           // draw the text
           foreach (var text in texts)
           {
               myCanvas.DrawText(text, ??, ??, paint);
           }
      }
}

编辑:在@Jason 的帮助下,我做到了:

var aaa = ToStream(CreateBitmapFromText(new List<string>() {"asas", "vvvv"}), SKEncodedImageFormat.Png);
_printService.PrintImage(aaa);

public Stream ToStream(SKImage image, SKEncodedImageFormat format)
{
    SKData encoded = image.Encode(format, 90);
    return encoded.AsStream();
}

public SKImage CreateBitmapFromText(List<string> texts)
{
     using var surface = SKSurface.Create(width: 640, height: 480, SKColorType.Gray8, SKAlphaType.Premul);
     SKCanvas myCanvas = surface.Canvas;

     // clear the canvas / fill with white
     myCanvas.DrawColor(SKColors.White);

     // set up drawing tools
     using (var paint = new SKPaint())
     {
           paint.TextSize = 64.0f;
           paint.IsAntialias = true;
           paint.Color = new SKColor(0x42, 0x81, 0xA4);
           paint.IsStroke = false;

           // draw the text
           foreach (var text in texts)
           {
               myCanvas.DrawText(text, 0.0f, 0.0f, paint);
           }
     }

     return surface.Snapshot();
}

当我将它发送到打印机时,我看到了这个(带有一些黑色小字符的白纸??在顶部?)

【问题讨论】:

  • 您究竟需要什么帮助?您似乎已经在创建画布并在其上绘制文本。有很多关于将画布保存为 jpg 或 png 的现有问题和文档。
  • @Jason Initialy 我想使用 SystemDrawing,但您建议使用 SkiSharp,因为提到的库在 xamarin 中不起作用,所以我跟进,现在我在这里使用这个画布。老实说,我什至不知道什么是画布以及是否可以将其保存为 img。一般来说,我的方法好吗?我的目标只是在图像(a5 格式)上写一些文本并作为流发送(如果有更多的文本不适合单个 a5,则应该创建下一个图像等。所有在 Xamarin 中。你能指出我吗?
  • 如果你已经有了SKSurface,那有什么问题?
  • 你为什么不试试看它是否有效?

标签: xamarin.forms


【解决方案1】:

通过将其添加到 OnCanvasViewPaintSurface 的末尾,我能够轻松修改 Xamarin FramedText 示例以保存位图

// get the SKImage from SKSurface
var image = surface.Snapshot();
// Encode as PNG, returns SKData
var data = image.Encode(SKEncodedImageFormat.Png, 100);
string path = Path.GetTempFileName();
// write byte[] to file, verify data with image viewer
File.WriteAllBytes(path, data.ToArray());

您应该能够轻松修改它以返回 byte[]stream

【讨论】:

    猜你喜欢
    • 2014-04-12
    • 2023-03-17
    • 2019-11-12
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多