如何解决通过其SVG副本生成的栅格图像中存在意外的视觉元素
使用SkiaSharp
库从它们的SVG副本(作为嵌入式资源附加到应用程序)生成的PNG图像(如下图所示)的背景中存在意外的残渣数量在Button
和ToolbarItem
视图中。
粗略地看,我认为问题与从SVG生成PNG图像的方式有关,但是到目前为止,由于我无法隔离有问题的部分,因此无法隔离导致此“不正确转换”的部分在GetEquivalentBitmapImagePath()
方法的实现中(如下所示)。
生成上述实体的代码:
string calculationHistoryIcon = GetEquivalentBitmapImagePath
(CALCULATION_HISTORY_ICON_RESOURCE_IDENTIFIER,80,80);
ToolbarItem calculationHistoryToolbarItem = new ToolbarItem()
{ IconImageSource = calculationHistoryIcon };
this.ToolbarItems.Add(calculationHistoryToolbarItem);
生成上述实体的代码:
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 举报,一经查实,本站将立刻删除。