C # - Comment changer la qualité PNG ou la profondeur de couleur
Je suis censé écrire un programme qui obtient quelques images PNG à partir de l'utilisateur, du fait des modifications simples comme la rotation et l'enregistre dans un fichier JAR, de sorte qu'il peut utiliser les images comme des ressources. Le problème est quand je l'ouvre, une 80 ko de l'image et de l'enregistrer avec le C#, j'obtiens une image avec la même qualité mais pour 130kb de l'espace. Et parce qu'il a d'aller à l'intérieur d'un J2ME jar fichier que j'ai vraiment besoin de plus faible taille, à moins de la taille d'origine. J'ai essayé le code ci-dessous mais plus tard découvert qu'il ne fonctionne que pour les images Jpeg.
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
int j = 0;
for (j = 0; j < codecs.Length; j++)
{
if (codecs[j].MimeType == "image/png") break;
}
EncoderParameter ratio = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 10L);
EncoderParameters CodecParams = new EncoderParameters(1);
CodecParams.Param[0] = ratio;
Image im;
im = pictureBox1.Image;
im.Save(address , codecs[j], CodecParams);
C'est là que l'image est chargée dans une zone de l'image:
private void pictureBox1_DoubleClick(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
string address = openFileDialog1.FileName;
address.Replace("\\", "\\\\");
Image im = Image.FromFile(address);
pictureBox1.Image = im;
}
}
Et c'est là que c'est d'être sauvé de retour avec aucune édition:
private void generateToolStripMenuItem_Click(object sender, EventArgs e)
{
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
int j = 0;
for (j = 0; j < codecs.Length; j++)
{
if (codecs[j].MimeType == "image/png") break;
}
EncoderParameter ratio = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 10L);
EncoderParameters CodecParams = new EncoderParameters(1);
CodecParams.Param[0] = ratio;
string address = folderBrowserDialog1.SelectedPath;
address = address + "\\";
address.Replace("\\", "\\\\");
Image im;
im = pictureBox1.Image;
im.Save(address + imageFileNames[1], codecs[j], CodecParams);
Remarque: imageFileNames[] est juste un tableau de chaînes qui possède certaines des noms de fichier de laquelle les images doivent être enregistrées.
Toutes les idées seront appréciées et merci d'avance.
source d'informationauteur Auxiliary
Vous devez vous connecter pour publier un commentaire.
J'ai pris 4 différents Png, allant dans les tailles de 2 KO à 2,6 MO. À l'aide de votre code, je de les charger et de les enregistrer. Je ne modifie pas l'image par rotation ou retournement. Tous les 4 Png, lors de la ré-enregistrés, ont exactement la même taille.
En plus, j'ai pris la 2.6 MO PNG, ouvert Photoshop et enregistré deux copies, l'une entrelacé (réduit à 2.06 MO), un non-entrelacé (réduit à 1,7 MO). J'ai ensuite pris chacun de ceux-ci, couru par le biais de votre code et les a sauvés. La résultante de toutes les tailles de ont été à l'origine de 2,6 MO.
Donc, ma conjecture est que les images originales ont été créées avec un logiciel (comme photoshop) et ce morceau de logiciel a une compression optimisée de l'algorithme qu'il utilise pour le PNG spec .NET à ne pas les utiliser.
J'ai foiré autour avec le EncoderParameter pour la Compression, mais il ne semble pas avoir d'impact.
Désolé d'avoir une vieille question, mais je devais résoudre le même problème aujourd'hui et a trouvé cette page sur le site MSDN: "Liste des Paramètres et des Valeurs pour Tous les Encodeurs". J'espère que ça peut être utile de se référer à elle.
L'article contient un exemple de programme qui sorties
EncoderParameter
s pris en charge par GDI+ image encodeurs, et PNG encodeur prend pas en charge les paramètres selon elle.Je ne suis pas sûr de la pensée, si l'on peut prendre cela pour acquis, ou dans une version future de
gdiplus.dll
le PNG codeur pourrait croître de plus de soutien, et donc on est censé vérifier le codeur de capacités au moment de l'exécution.En tout cas, l'application de certaines explicite de la transformation sur une source de l'image semble être l'approche plus fructueuse; je n'ai pas l'explorer encore.