【发布时间】: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