11
votes

c # bitmap.save transparence ne sauve pas dans png

J'essaie d'enregistrer une classe bitmap qui a une transparence en tant que fichier PNG avec transparence. Je n'ai pas de chance.

Le bitmap a une transparence, il ne sauve que la transparence.

C'est ce que je fais

SETUP BITTMAP xxx

sauvegarding xxx

J'ai également essayé d'enregistrer le fichier avec un filtream et qui n'a fait aucune différence.

Lorsque l'image est dans une zone d'image, la transparence existe, mais quand je sauverai, je viens d'obtenir un fond noir.

Je ne veux vraiment pas utiliser de code tiers, ils ont trouvé un moyen de Faites-le, j'aimerais aussi.

Merci.


2 commentaires

Comment vérifiez-vous la transparence de l'image? Si vous le regardez dans la peinture, cela ne prend pas en charge la transparence.


J'utilise l'option "Aperçu" de Windows XP et GIMP


10 Réponses :


2
votes

Avez-vous été un certain temps depuis que j'ai fait l'édition d'image / sauvegarde, mais si je me souviens que les PNG à droite sont différents que la plupart. Je pense que vous devez utiliser un fichier filtre réel.

éditer: ah, trouvé un exemple ici xxx

EDIT2: Après plus de recherches à ce sujet, je pense que la marche intermédiaire n'est requise que dans certaines circonstances.

C'est aussi Possible que, parce que vous utilisez "MakeTransparent", il attrape un alpha indexé, mais essayant de sauvegarder en fonction de la valeur alpha de chaque pixel. Vous pouvez essayer de définir des valeurs alpha de l'image.


6 commentaires

J'ai déjà essayé cela et ça n'a pas fait la différence. merci de toute façon cependant.


Édité et ajouté une autre solution possible.


Modifier les valeurs alpha de l'image?


Les pixels. Initialisez toutes les valeurs à 0 alpha, puis faites votre édition. Vous pouvez utiliser des verrouilles.


Je pense que cela pourrait être ça ... je vais l'essayer demain et voir ce qui se passe.


J'ai essayé SetPixel pour définir tous les pixels vers ArgB (0,255 255.255) et cela n'a changé rien d'Eather.



1
votes
ret.MakeTransparent(...);

2 commentaires

Non, le bitmap n'a de transparence, cela ne sauve que la transparence.


Cela n'ajoute pas de données transparentes à l'image pour stocker



3
votes

Avez-vous essayé d'utiliser bitmap.maketransparent () méthode?


11 commentaires

Non, le bitmap n'a de transparence, cela ne sauve que la transparence.


Pouvez-vous fournir plus de code alors? Aussi, avez-vous déjà appelé bitmap.maketransparent?


J'utilise le bitmap.maketransparent (couleur .Transparent) est de savoir comment je le fais. Ensuite, j'utilise la classe graphique et faites un .clear (couleur .Transparent). Ensuite, je dessine des choses avec la classe graphique et le bitmap résultant affiche la transparence du programme (dans une zone d'image), mais lors de l'enregistrement en tant que PNG, affiche simplement le noir.


Avez-vous juste essayé d'économiser en tant que bitmap.save ("file.png")?


Juste fait, ne change rien.


Avez-vous considéré que vous pourriez avoir un bogue dans votre code? Fournir à votre code ici aiderait mieux les gens à répondre à la question.


J'aurais dû fournir suffisamment ... encore mon problème est la sauvegarde d'une image qui a déjà transparanany ... Je crois que j'ai assez de code pertinent dans ce poste.


Avez-vous essayé bitmap.maketransparent (color.black) (au lieu de couleur.Transparent) et voyez si vous obtenez vraiment un fichier transparent enregistré? BTW, cela pourrait être mieux si vous modifiez votre question pour dire ce que vous faites, plutôt que de le laisser ici dans les commentaires.


heh ... c'était une erreur de codage de ma part. J'étais mal interprété l'extension de fichier ... C'était en réalité appeler Savingfile (nom de fichier, imageformat.bitmap)


:-). C'est généralement une bonne idée de couper et de coller votre code ici, plutôt que de taper ce que vous pensez que c'est.


Fondamentalement, j'ai supposé que le filtreIndex d'une boîte de dialogue a commencé à 0 ... mais pour une raison massette, cela commence à 1. J'aurais tout posté mais il est trop complexe et grand. La plupart des postes auraient été des questions posant des questions.



0
votes

Sauvegarde en tant que PNG nécessite un flux recherché comme FileStream ou Morthstream. Si vous économisez dans l'un de là et que vous vous trouvez de là, il y aura une exception NOE GDI + ou similaire. J'espère que cela aide.


0 commentaires

9
votes

Êtes-vous sûr que le format pixel du bitmap est system.drawing.iming.pixelformat.format32bppargb ? Je suis tombé sur cette question parce que j'avais le même problème, mais c'était parce que je chargeais une image qui n'avait pas de composant alpha à son format de pixel. J'ai fait xxx

et il a correctement enregistré le PNG avec le composant alpha.

aussi, si vous utilisez Maketransparent () Soyez sûr que la couleur que vous faites transparent existe dans votre image.


0 commentaires

0
votes

J'ai supposé que le filtreIndex d'une boîte de dialogue a commencé à 0 ... mais cela commence à 1, mes images étaient donc enregistrées comme des gifs utilisant une transparence alpha, et GIF ne prend pas en charge la transparence alpha. Donc, mon problème était en fait avec la boîte de dialogue.


0 commentaires

1
votes

La raison est que la classe bitmap ne fonctionne pas avec la transparence.

Vous devez lancer bitmap à image . xxx


4 commentaires

Non, le bitmap n'a de transparence.


Une fois que j'ai ajouté le ret.maketransparent (couleur.white); juste avant l'img.save (nom de fichier, imageformat.png); Ensuite, mes images PNG avaient une transparence. N'a pas besoin de la distribution.


La coulée n'ajoute pas de fonctionnalité.


image est juste une classe abstraite et bitmap est une implémentation de image que fait la transparence.



0
votes

Les formats graphiques réseau portables (.png) prend en charge la transparence, donc lors de l'enregistrement de l'image Format d'image sur ImageFormat.png.

        //update image to database
        MemoryStream msImage = new MemoryStream();
        imgPhoto.Save(msImage, System.Drawing.Imaging.ImageFormat.Png);
        byte[] Img = (byte[])msImage.ToArray();


0 commentaires

1
votes

Je voulais juste rappeler à tous que Maketransparent, comme cela a été suggéré mes nombreuses personnes ici, ne fait que la couleur spécifique transparente . Il ne prend pas en compte le canal alpha de l'image Argb. Donc, un pixel avec une valeur alpha de 100, par exemple, s'il ne correspond pas à la couleur fournie à MakeTransparent, n'aura pas de transparence partielle.


0 commentaires

0
votes

Bien que la question soit très ancienne mais ce que le code fonctionne pour moi. XXX


0 commentaires