Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从PNG文件的URI创建具有透明度的位图对象_C#_Wpf_Gmap.net - Fatal编程技术网

C# 从PNG文件的URI创建具有透明度的位图对象

C# 从PNG文件的URI创建具有透明度的位图对象,c#,wpf,gmap.net,C#,Wpf,Gmap.net,我在尝试使用带有“Resource”构建操作的PNG图像生成GMap.NET的地图标记时遇到问题,它需要位图类型 我使用包Uri创建BitmapImage,然后使用Sascha Henning在其回答中提供的代码将BitmapImage转换为位图: 生成的代码如下所示: BitmapImage bmi = new BitmapImage( new Uri("pack://application:,,,/Images/MapMarker_JobComplete.png")); Syste

我在尝试使用带有“Resource”构建操作的PNG图像生成GMap.NET的地图标记时遇到问题,它需要位图类型

我使用包Uri创建BitmapImage,然后使用Sascha Henning在其回答中提供的代码将BitmapImage转换为位图:

生成的代码如下所示:

BitmapImage bmi = new BitmapImage(
    new Uri("pack://application:,,,/Images/MapMarker_JobComplete.png"));
System.Drawing.Bitmap markerBitmap = Helpers.BitmapImageToBitmap(bmi);
GMarkerGoogle marker = new GMarkerGoogle(jobLoc, markerBitmap);
其中Helpers.BitmapImageToBitmap()是:

上述方法可以工作,但图像是用黑色背景而不是透明背景渲染的。我只能假设转换为BitmapImage或从BitmapImage转换为位图是由我负责的

我发现需要将PNG图像保存到较低的深度,但使用当前安装的软件(Affinity),我无法以16位深度导出,只能导出PNG-8(8位深度;红色背景,可能是因为质量降低)或标准PNG-24(32位深度;黑色背景)


目前,为了获得所需的结果(支持透明度),我使用PNG和“Content”的构建操作,并使用以下代码:

System.Drawing.Image imgMarker = System.Drawing.Bitmap.FromFile(
    System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
        "Images/MapMarker_JobComplete.png"));
GMarkerGoogle marker = new GMarkerGoogle(jobLoc, (System.Drawing.Bitmap)imgMarker);
上面的方法很好,所以位图必须支持透明性,但这让我可以将PNG文件作为内容,我更喜欢将它们嵌入到可执行文件中,并且可以在需要时使用XAML中的包Uri


很明显,有些知识我还没有掌握或无法掌握,还有很多关于人们希望保持透明度的话题,但最终结果是位图图像而不是我所需要的位图。

我不确定,但我猜(根据您的解释)BmpBitmapEncoder不支持(创建)32bpp BMP。你为什么不试着改用PngBitmapEncoder呢?@elgonzo现在我觉得自己太笨了,马上就修好了。赛尔夫注意,彻底研究示例代码寻找替代方案。我怎么能在给你评分的同时关闭它呢?嗯,我也觉得有点笨;-)因为没有意识到,您可以简单地以流的形式打开嵌入式PNG资源,让System.Drawing.Bitmap直接加载它,而不需要BitmapImageToBitmap中的内容。请参阅Josip Medved和Hallgrim对此问题的回答:上述使用反射的解决方案是否比使用位图编码器对性能的影响更大?我们过去遇到过客户使用软件和报告速度慢的问题。我不知道一种方法与另一种方法相比慢了多少或快了多少。但这真的很重要吗,不管速度是快是慢?您希望/需要从中加载数百张图片作为嵌入式资源,以使性能差异显著?如果您认为存在或可能存在性能问题,请通过使用这两种方法分析代码来验证您的想法的正确性…我不确定,但我猜(根据您的解释)BmpBitmapEncoder不支持(创建)32bpp BMP。你为什么不试着用PngBitmapEncoder来代替呢?@elgonzo现在我觉得自己太傻了,马上就修好了。请注意,彻底调查示例代码以寻找替代方案。我怎么才能在给你信用的同时关闭这个呢?嗯,我也觉得有点愚蠢;-)因为没有意识到,您可以简单地以流的形式打开嵌入式PNG资源,让System.Drawing.Bitmap直接加载它,而不需要BitmapImageToBitmap中的内容。请参阅Josip Medved和Hallgrim对此问题的回答:上述使用反射的解决方案是否比使用位图编码器对性能的影响更大?我们过去遇到过客户使用软件和报告速度慢的问题。我不知道一种方法与另一种方法相比慢了多少或快了多少。但这真的很重要吗,不管速度是快是慢?您希望/需要从中加载数百张图片作为嵌入式资源,以使性能差异显著?如果您认为存在或可能存在性能问题,请通过使用这两种方法分析代码来验证您的想法的正确性。。。
System.Drawing.Image imgMarker = System.Drawing.Bitmap.FromFile(
    System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory,
        "Images/MapMarker_JobComplete.png"));
GMarkerGoogle marker = new GMarkerGoogle(jobLoc, (System.Drawing.Bitmap)imgMarker);