我在尝试使用带有“资源”构建动作的PNG图像和GMap.NET的地图标记生成(希望其类型为Bitmap)时遇到问题。
我使用Uri包创建了一个BitmapImage,然后使用Sascha Henning在其答案中提供的代码将BitmapImage转换为Bitmap: Converting BitmapImage to Bitmap and vice versa
结果代码如下:
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()在哪里:
public static Bitmap BitmapImageToBitmap(BitmapImage bitmapSource)
{
using( MemoryStream outstream = new MemoryStream())
{
BitmapEncoder enc = new BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bitmapSource));
enc.Save(outstream);
return new System.Drawing.Bitmap(outstream);
}
}
上面的方法有效,但是图像是用黑色背景而不是透明背景渲染的。我只能假定负责转换为BitmapImage或从BitmapImage转换为Bitmap。
我发现a reference需要将PNG图像保存到较低的深度,但是使用当前安装的软件(Affinity),我无法导出16位的深度,只能导出PNG-8(位深度为8;红色背景,由于质量下降而导致的presumaby)或标准PNG-24(位深度为32;黑色背景) PNG-24 PNG-8
当前为了获得所需的结果(支持透明度),我将PNG与“内容”的构建操作配合使用,并使用以下代码:
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包
很明显,我缺少某些知识或无法收集信息,并且有很多关于人们想要保持透明度的主题,但是最终的结果是BitmapImage而不是像Bitmap我需要。