问题描述
使用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;
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 (将#修改为@)