根据PNG文件的URI创建具有透明度的位图对象

时间:2019-03-05 14:19:06

标签: c# wpf gmap.net

我在尝试使用带有“资源”构建动作的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我需要。

0 个答案:

没有答案