Создание растрового объекта с прозрачностью из URI файла PNG - PullRequest
0 голосов
/ 05 марта 2019

У меня возникли проблемы при попытке использовать изображение PNG с действием сборки 'Resource' с генерацией маркера карты GMap.NET, которая ожидает тип Bitmap.

Я создаю BitmapImage, используя пакет Uri, а затем преобразую BitmapImage в Bitmap, используя код, предоставленный Сашей Хеннингом в их ответе здесь: Преобразование BitmapImage в Bitmap и наоборот

Полученный код выглядит следующим образом:

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 является ответственным.

Я нашел ссылку на необходимость сохранения PNG-изображений на более низкую глубину, но с установленным в данный момент программным обеспечением (Affinity) я не смог экспортировать с битовой глубиной 16, как было сказано, только PNG- 8 (битовая глубина 8; красный фон, предположительно из-за пониженного качества) или стандарт 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);

Вышеописанное работает нормально, поэтому Bitmap должен поддерживать прозрачность, но при этом я оставляю файлы PNG в качестве содержимого, и я бы предпочел, чтобы они были встроены в исполняемый файл, а также имел возможность использовать пакет Uri в XAML, если / когда это необходимо .

Ясно, что есть некоторые знания, которые мне не хватает или которые я не смог найти, и есть довольно много тем о людях, желающих сохранить прозрачность, но с конечным результатом BitmapImage, а не Bitmap, как Я требую.

...