10
votes

Comment peindre une zone d'un bitmap avec «blanc transparent»?

Je veux remplacer tous les pixels dans une région rectangulaire d'un bitmap avec "blanc transparent" - I.e., A = 0, B = 255, R = 255, G = 255.

FLIDRECTANGNE ne le fait pas - donné une brosse transparente, les pixels existants sont inchangés.

Dois-je utiliser Setpixel individuellement pour chaque pixel dans le rectangle?


0 commentaires

6 Réponses :


0
votes

FLIDRECTANGNE ne le fait pas - donné une brosse transparente, les pixels existants sont inchangés.

a du sens, puisque vous dessinez avec 0% d'opacité. :)

Une solution rapide pour un contrôle serait une clé de couleur. Vous pouvez définir la couleur de la clé du contrôle sur une couleur spécifique (I.e. magenta); Tous les pixels de cette couleur seraient alors rendus transparents. (Si le contrôle le supporte, bien sûr.)

cela, ou bitmap.maketransparent (couleur) à des fins générales. Le problème est encore une fois que la couleur spécifiée serait transparente, vous devez donc choisir une couleur qui n'existe pas dans l'image. (Il y a un autre exemple ici: https://web.archive.org/web/20131030025202/http://msdn.microsoft.com/en-us/library/ms172507 (v = vs.80) .aspx < / a>)

EDIT: À la fin, l'approche Lockbits () mentionnée dans les autres commentaires pourrait être ce que vous recherchez. Une fois que vous comprenez comment les valeurs de largeur et de foulée interagissent, il est facile de manipuler l'image au niveau le plus bas possible. Voici un exemple général: https: //web.archive .org / Web / 20141229164101 / http: //bobpowell.net/Lockingbits.aspx Assurez-vous simplement que l'image prend en charge la transparence (voir pixelformat), puis verrouillez l'image avec un mode approprié (c'est-à-dire un mode approprié (c'est-à-dire que la lecture de chaque pixel, lisez vos octets, écrivez votre nouvelle couleur, etc.


2 commentaires

Oui, ça a du sens totalement :) J'étais juste dire. Outre cela, je ne pense pas que votre réponse soit pertinente - je travaille avec un bitmap, pas un contrôle. Et bien que je puisse peindre le rectangle une couleur particulière (et espérons que cette couleur ne présente nulle part ailleurs dans l'image), puis le rendre transparent, puis-je spécifier «blanc transparent»? Je ne le pense pas.


YourbAmap.MakeTransparent (couleur.white) devrait faire ça. L'inconvénient est que tout ce qui est blanc est transparent alors, c'est vrai. Un problème est que tous les formats d'image ne prennent pas en charge la transparence. Cela dépend probablement également de la création de votre objet d'image. Regardez l'énumération et le membre de PixelFormat. Et puis, bien sûr, l'approche de verrouille le bitmap pour travailler dans la dimension de pointeur "dangereuse". Qu'est-ce que Pete a dit. :)



3
votes

Si vous utilisez les méthodes de peinture composite, l'alpha sera utilisé pour mélanger la couleur, de sorte que rien ne se produira.

Si vous souhaitez définir le bitmap, créez-le à partir de données avec l'arrière-plan souhaité ou définissez l'arrière-plan à l'aide de Lockbits pour manipuler les données en masse.

Vous pourriez également pouvoir utiliser une méthode BitBlt avec les indicateurs appropriés, mais je ne sais pas comment traduire cela au code géré.


0 commentaires

0
votes

Ce petit hack devrait faire l'affaire: xxx


2 commentaires

Nan. Qui définit les pixels sur "noir transparent": 0,0,0,0, pas "blanc transparent": 0,255 255 25555.


Vous pouvez le changer en g.cclear (couleur.fromargb (0, 255, 255, 255)); Bien que la réponse de Hans Passant soit probablement meilleure



5
votes

Je pense que vous devez utiliser SetPixel (ou une méthode équivalente de réglage des valeurs de couleur directement) pour que les pixels soient "blanc transparent".

Vous pouvez utiliser le graphique.clear Méthode pour régler la couleur ou les pixels, mais vous ne pouvez pas l'utiliser pour les mettre à la fois transparent et une couleur. J'ai essayé ceci pour régler les pixels dans une partie d'un bitmap: xxx

Les pixels de la région se retrouvent "noir transparent": 0,0,0,0. Même dessiner un rectangle blanc solide avant de pouvoir ne pas aider. Lorsque l'alpha est égal à zéro d'une couleur, les autres composants de couleur sont également zéro.

L'utilisation d'un alpha presque transparent comme 1 fonctionne bien, les pixels se retrouvent comme "blanc presque transparent": 1 255 2555,255.


0 commentaires

14
votes

Vous devrez définir la propriété graphiques.co. / code>. Par exemple: xxx

La couleur réelle que vous utilisez n'a pas d'importance, vous obtiendrez un rectangle noir avec un alpha de 0.


2 commentaires

Ce n'est pas que Peu fréquent d'utiliser des canaux de couleur pour les données, dites pour une carte de terrain dans un jeu où l'eau, les routes, les roches, la neige sont Argb. Donc, vous voulez parfois être capable de créer des bitmaps avec des valeurs RGB zéro alpha et non zéro.


Entre la couleur de mon cas est pertinente en raison du traitement ultérieur qui «mélange» les zones transparentes de zones transparentes avec d'autres couleurs de zones.



1
votes

Conseil important: strong>

Assurez-vous que lorsque vous créez l'image que vous effectuez cette image p> xxx pré>

et non p>

mainImage = new Bitmap(totalWidth, maxHeight, PixelFormat.Format32bppRgb);


0 commentaires