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.
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.
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.
si c'est une PictureBox à l'intérieur d'une autre, vous pouvez utiliser:
innerPictureBox.SendToBack();
innerPictureBox.Parent = outerPictureBox;