Xamarin:如何在 SkiaSharp 位图的中心对齐徽标图像
Xamarin: How can I align a logo image in the center of a SkiaSharp Bitmap
我正在尝试将徽标对齐 SKBitmap
。
这是我的代码:
SKBitmap bmpResult = SKBitmap.Decode(imgByteArray);
bitmap.DrawBitmap(bmpResult, 0, 20);
我已经尝试过不同的图像,但结果是一样的。
我知道 SkiaSharp 有 MeasureText
,但是,正如它所说,用于文本,而不用于图像。
我试图用 DeviceDisplay.MainDisplayInfo.Width
得到我的设备宽度并除以 2,但没有结果。
注意,即使我得到一个精确的数字来划分(例如:bitmap.DrawBitmap(bmpResult, DeviceDisplay.MainDisplayInfo.Width / 2, 20);
),当我有不同的屏幕密度时,最终结果也会不同,即与一个设备对齐,与其他人不对齐。
有人知道我该如何解决吗?
您可以创建两个位图(位图 1、位图 2)。先画bitmap1,再画bitmap2。我在中间做了两张位图供大家参考。
public partial class Page8 : ContentPage
{
SKBitmap bitmap1 = new SKBitmap();
SKBitmap bitmap2 = new SKBitmap();
public Page8()
{
InitializeComponent();
bitmap1 = LoadBitmapResource(typeof(Page8), "App3.image.jpeg");
bitmap2 = LoadBitmapResource(typeof(Page8), "App3.durian_64.png");
// Create the SKCanvasView and set the PaintSurface handler
SKCanvasView canvasView = new SKCanvasView();
canvasView.PaintSurface += OnCanvasViewPaintSurface; ;
Content = canvasView;
}
private void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args)
{
SKImageInfo info = args.Info;
SKSurface surface = args.Surface;
SKCanvas canvas = surface.Canvas;
canvas.Clear();
float x1 = (info.Width - bitmap1.Width) / 2;
float y1 = (info.Height - bitmap1.Height) / 2;
float x2 = (info.Width - bitmap2.Width) / 2;
float y2 = (info.Height - bitmap2.Height) / 2;
canvas.DrawBitmap(bitmap1, x1, y1);
canvas.DrawBitmap(bitmap2, x2, y2);
}
public static SKBitmap LoadBitmapResource(Type type, string resourceID)
{
Assembly assembly = type.GetTypeInfo().Assembly;
using (Stream stream = assembly.GetManifestResourceStream(resourceID))
{
return SKBitmap.Decode(stream);
}
}
}
在屏幕截图中,您会在位图 1 的中心看到位图 2(绿色榴莲)。
我正在尝试将徽标对齐 SKBitmap
。
这是我的代码:
SKBitmap bmpResult = SKBitmap.Decode(imgByteArray);
bitmap.DrawBitmap(bmpResult, 0, 20);
我已经尝试过不同的图像,但结果是一样的。
我知道 SkiaSharp 有 MeasureText
,但是,正如它所说,用于文本,而不用于图像。
我试图用 DeviceDisplay.MainDisplayInfo.Width
得到我的设备宽度并除以 2,但没有结果。
注意,即使我得到一个精确的数字来划分(例如:bitmap.DrawBitmap(bmpResult, DeviceDisplay.MainDisplayInfo.Width / 2, 20);
),当我有不同的屏幕密度时,最终结果也会不同,即与一个设备对齐,与其他人不对齐。
有人知道我该如何解决吗?
您可以创建两个位图(位图 1、位图 2)。先画bitmap1,再画bitmap2。我在中间做了两张位图供大家参考。
public partial class Page8 : ContentPage
{
SKBitmap bitmap1 = new SKBitmap();
SKBitmap bitmap2 = new SKBitmap();
public Page8()
{
InitializeComponent();
bitmap1 = LoadBitmapResource(typeof(Page8), "App3.image.jpeg");
bitmap2 = LoadBitmapResource(typeof(Page8), "App3.durian_64.png");
// Create the SKCanvasView and set the PaintSurface handler
SKCanvasView canvasView = new SKCanvasView();
canvasView.PaintSurface += OnCanvasViewPaintSurface; ;
Content = canvasView;
}
private void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args)
{
SKImageInfo info = args.Info;
SKSurface surface = args.Surface;
SKCanvas canvas = surface.Canvas;
canvas.Clear();
float x1 = (info.Width - bitmap1.Width) / 2;
float y1 = (info.Height - bitmap1.Height) / 2;
float x2 = (info.Width - bitmap2.Width) / 2;
float y2 = (info.Height - bitmap2.Height) / 2;
canvas.DrawBitmap(bitmap1, x1, y1);
canvas.DrawBitmap(bitmap2, x2, y2);
}
public static SKBitmap LoadBitmapResource(Type type, string resourceID)
{
Assembly assembly = type.GetTypeInfo().Assembly;
using (Stream stream = assembly.GetManifestResourceStream(resourceID))
{
return SKBitmap.Decode(stream);
}
}
}
在屏幕截图中,您会在位图 1 的中心看到位图 2(绿色榴莲)。