2013-09-06 2 views
2

Сейчас у меня есть форма с PictureBox на форме. Я использую два частично прозрачных изображения и пытаюсь поставить один поверх другого.Есть ли обходной путь для наложения прозрачных изображений из ресурсов?

  • sideMenuWide = скругленный прямоугольник с прозрачным фоном (.png) [Нижнее изображение]
  • labelPointer = треугольник с прозрачным фоном (.png) [Лучшие изображения]

Здесь мой подход:

// METHOD #1 // 
Image img1 = Image.FromFile(@"C:\sideMenuWide.png"); 
Image img2 = Image.FromFile(@"C:\labelPointer.png"); 
picBox.Image = CombineImages(img1, img2); 

// METHOD #2 // 
Image imgA = RBS.Properties.Resources.sideMenuWide; 
Image imgB = RBS.Properties.Resources.labelPointer; 
picBox.Image = CombineImages(imgA, imgB); 

И функция CombineImage: (Я не писал е эта функция, только модифицированный)

public static Bitmap CombineImages(Image imgA, Image imgB) 
    { 
     //a holder for the result (By default, use the first image as the main size) 
     Bitmap result = new Bitmap(imgA.Size.Width, imgA.Size.Height); 

     //use a graphics object to draw the resized image into the bitmap 
     using (Graphics graphics = Graphics.FromImage(result)) 
     { 
      //set the resize quality modes to high quality 
      graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
      graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
      graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
      //draw the images into the target bitmap 
      graphics.DrawImage(imgA, 0, 0, imgA.Width, imgA.Height); 
      graphics.DrawImage(imgB, 100, 70, imgB.Width, imgB.Height); 
     } 
     return result; 
    } 

Метод # 1 НЕ работает, как я хочу его, отображает imgB отлично на вершине IMGA.

Метод # 2 однако показывает, что imgA просто отлично, но imgB действительно слабый.

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

+0

Я думаю, что ваш «новый Bitmap» должен возвращать один с палитрой 32-битным. Я не уверен, что это значение по умолчанию. – Brannon

+3

любой снимок экрана? –

ответ

0

Если файлы работают при загрузке, но ресурсов нет, то это похоже на процесс сборки resx или ResourceManager делает что-то нежелательное. Я бы попытался вставить файлы и прочитать их непосредственно из потока, а не полагаться на ResourceManager, чтобы сделать это за вас.

  • В вашем обозревателе решений Добавить существующий файл, чтобы добавить файл в проект. Получить свойства на добавленном файле и установить его на Embedded Resource =. (Не добавляйте его в Resx файл)

  • В своем коде, теперь вы можете получить поток, содержащий данные файла:

    Stream instream = Assembly.GetExecutingAssembly(). 
            GetManifestResourceStream("RBS.labelPointer.png")); 
    

    (Подсказка: компилятор генерирует тупые имя для внедренный ресурс, поэтому после добавления файлов, которые вы можете добавить временный код для вызова Assembly.GetExecutingAssembly(). GetManifestResourceNames(), чтобы получить список всех них и найти файл, который вы заинтересованы в)

  • Загрузите ваш растровый/изображение из потока:

    Image img2 = new Bitmap(inStream);

+0

Спасибо всем, ребята, за то, что дали мне отличные места для начала! Идея потока работала фантастически! –

Смежные вопросы