Rendre transparent picturebox chevauchant C#.net

j'ai deux pictureboxes superposées.Les images des deux boîtes d'images ont quelques pixels transparents.Je veux voir la zone d'image du bas à travers les pixels transparents de la zone d'image chevauchante.

j'ai essayé de définir la couleur de fond des deux boîtes d'image comme transparent.Mais il fixe juste la couleur de dos de la boîte d'image à la couleur de fond de la forme.

5
demandé sur Ed Schwehm 2011-01-07 09:47:52

3 réponses

clairement vous utilisez Winforms. Oui, la transparence est simulée en dessinant les pixels du Parent. Qui est la forme, vous voyez seulement les pixels de forme, les effets d'empilage ne fonctionnent pas. Il y a un KB article qui montre une solution pour cela. Il est douloureux. Une autre approche consiste à ne pas utiliser les commandes PictureBox mais simplement à dessiner les images dans L'événement de peinture de la forme.

considérez WPF, il a un modèle de rendu très différent qui soutient facilement transparence.

5
répondu Hans Passant 2011-01-07 07:02:56

les Solutions à ce problème peuvent être diverses, et cela dépend principalement de vos compétences et la quantité de travail dépendra du type d'images que vous traitez. Par exemple, si les images sont toujours de la même résolution, la taille et le chevauchement des supports d'image transparence, vous pouvez essayer de faire la manipulation de deux Image objets et dessiner l'un sur l'autre, puis l'afficher dans PictureBox . Ou si vous avez besoin de le faire plusieurs fois dans différents endroits de votre application, vous pourriez même envisager de créer votre propre UserContriol .

Code en réponse de cette question , méthode ResizeImage en particulier, montrer comment créer une image redimensionnée, de bonne qualité, tout ce dont vous avez besoin, il est de le changer un peu. Faire pour obtenir deux Images comme paramètres d'entrée, et de le modifier pour dessiner une image sur une autre.

les changements pourraient ressembler à ceci

    public static Bitmap CombineAndResizeTwoImages(Image image1, Image image2, int width, int height)
    {
        //a holder for the result
        Bitmap result = new Bitmap(width, 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(image1, 0, 0, result.Width, result.Height);
            graphics.DrawImage(image2, 0, 0, result.Width, result.Height);
        }

        //return the resulting bitmap
        return result;
    }

et l'utiliser, par exemple, comme ceci:

  pictureBox1.Image = CombineAndResizeTwoImages(Image.FromFile("c:\a.png"), Image.FromFile("c:\b.png"), 100,100);

mais que son seul exemple, et vous devez l'accorder à vos besoins. Bonne chance.

4
répondu MoreThanChaos 2017-05-23 10:28:21

si c'est une PictureBox à l'intérieur d'une autre, vous pouvez utiliser:

innerPictureBox.SendToBack(); innerPictureBox.Parent = outerPictureBox;

4
répondu Martynas 2012-07-19 08:05:28