是否存在从资源覆盖透明图像的解决方法?

时间:2013-09-06 18:09:47

标签: c# image

现在我的表单上有一个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 按照我想要的方式工作,在imgA上完美地显示imgB。

方法#2 但显示imgA很好,但imgB非常微弱。

关于如何克服这个问题的任何想法?我希望能够使用Resources执行此操作,而不必从文件中提取。

1 个答案:

答案 0 :(得分:0)

如果文件在加载时有效,但资源没有,则听起来像resx构建过程或ResourceManager正在做一些不受欢迎的事情。我会尝试嵌入文件并直接从流中读取它们,而不是依靠ResourceManager为您完成。

  • 在解决方案资源管理器中,添加现有文件将文件添加到项目中。获取添加文件的属性并将其设置为 Embedded Resource = 。 (不要将其添加到resx文件中)

  • 在您的代码中,您现在可以获得包含文件数据的流:

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

    (提示:编译器为嵌入式资源生成一个钝名称,因此在添加文件后,您可以添加临时代码来调用Assembly.GetExecutingAssembly()。GetManifestResourceNames()以获取所有文件的列表并查找您感兴趣的文件)

  • 从流中加载位图/图像:

    Image img2 = new Bitmap(inStream);