通过其SVG副本生成的栅格图像中存在意外的视觉元素

问题描述

使用SkiaSharp库从它们的SVG副本(作为嵌入式资源附加到应用程序)生成的PNG图像(如下图所示)的背景中存在意外的残渣数量ButtonToolbarItem视图中。

粗略地看,我认为问题与从SVG生成PNG图像的方式有关,但是到目前为止,由于我无法隔离有问题的部分,因此无法隔离导致此“不正确转换”的部分在GetEquivalentBitmapImagePath()方法的实现中(如下所示)。

ToolbarItem with the problematic image

生成上述实体的代码

string calculationHistoryIcon = GetEquivalentBitmapImagePath
                          (CALculaTION_HISTORY_ICON_RESOURCE_IDENTIFIER,80,80);
ToolbarItem calculationHistoryToolbarItem = new ToolbarItem()
                { IconImageSource = calculationHistoryIcon };
this.toolbaritems.Add(calculationHistoryToolbarItem);

Button with the problematic image

生成上述实体的代码

string fullKeypadIcon = GetEquivalentBitmapImagePath
                        (FULL_KEYPAD_ICON_RESOURCE_IDENTIFIER,50,80);
Button keypadBtn = new Button()
{
    HorizontalOptions = Layoutoptions.Fill,VerticalOptions = Layoutoptions.Fill
};
keypadBtn.ImageSource = fullKeypadIcon;

以下方法用于生成PNG图像:

private string GetEquivalentBitmapImagePath
        (string embeddedVectorIdentifier,float widthOfBitmapImage,float heightOfBitmapImage)
{
    // For converting vector (.svg) images to raster images
    SKSvg svg;
    SKBitmap bitmap;
    SKCanvas canvas;
    SKImage image;
    SKData encodedData;
    Stream imagestream;

    string vectorImageFile;
    Stream embeddedResourceStream;
    FileStream vectorimagestream,bitmapimagestream;
    string bitmapImagePath;

    if (widthOfBitmapImage < 1)
        throw new ArgumentException("Invalid value passed","widthOfFinalImage");
    if (heightOfBitmapImage < 1)
        throw new ArgumentException("Invalid value passed","heightOfFinalImage");

    try
    {
        vectorImageFile = Path.Combine(FileSystem.CacheDirectory,embeddedVectorIdentifier);
        embeddedResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(embeddedVectorIdentifier);
        vectorimagestream = new FileStream(vectorImageFile,FileMode.Create,FileAccess.Write);
        embeddedResourceStream.copyTo(vectorimagestream);
        embeddedResourceStream.Flush();
        vectorimagestream.Flush();
        embeddedResourceStream.Close();
        embeddedResourceStream.dispose();
        vectorimagestream.Close();
        vectorimagestream.dispose();

        svg = new SKSvg(new SKSize(widthOfBitmapImage,heightOfBitmapImage));
        svg.Load(vectorImageFile);
        bitmap = new SKBitmap(Convert.ToInt32(svg.CanvasSize.Width),Convert.ToInt32(svg.CanvasSize.Height));
        canvas = new SKCanvas(bitmap);

        canvas.DrawPicture(svg.Picture);
        canvas.Flush();
        canvas.Save();
        image = SKImage.FromBitmap(bitmap);
        encodedData = image.Encode(SKEncodedImageFormat.Png,100);
        bitmapImagePath = vectorImageFile.Replace(".svg",".png");
        bitmapimagestream = File.Open(bitmapImagePath,FileAccess.Write,FileShare.None);
        encodedData.Saveto(bitmapimagestream);
        bitmapimagestream.Flush(true);
        bitmapimagestream.dispose();
        File.Delete(vectorImageFile);
        return bitmapImagePath;
    }
    catch (Exception ex)
    {
        throw;
    }
}

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)