Je ne pouvais pas m'en empêcher, encore une fois je vous demande de l'aide. Cette fois, je vais montrer le problème mieux que la dernière fois, j'espère. J'écris un programme pour vérifier si la quantification a une influence sur les tailles d'image. Pour ce faire, je dois avoir mis en œuvre:C# PNG Sauvegarde de l'image avec filtre sélectionné
- Ouvrir une image PNG (fait)
- "Quantifier" pixel par pixel jusqu'à la fin de l'image (DONE)
- Enregistrer (ce est le problème)
méthode du filtre PNG 0 définit cinq types de filtres de base: type Nom
0 - Aucun, 1 - Sub, 2 -, 3 pages - moyenne, 4 - Paeth
Et maintenant, je suis debout avec une image en mémoire que je veux sauver en utilisant l'un des filtres qui , mais après avoir vérifié plusieurs bibliothèques PNG, aucune d'entre elles ne me permet d'en choisir une. Quelqu'un peut-il m'aider avec cela ou au moins avec un filtre? Ici vous allez avec un code:
private void btnSelectImg_Click(object sender, EventArgs e)
{
openFileDialog1.Filter = "PNG Image | *.png";
DialogResult result = openFileDialog1.ShowDialog();
if (result == DialogResult.OK)
{
string imgPath = openFileDialog1.FileName;
tbSourceImageFile.Text = imgPath;
string[] NameCutter = imgPath.Split('\\');
lblFileName.Text = NameCutter.Last();
ImageToWork = Image.FromFile(imgPath);
System.Drawing.Imaging.ImageFormat Format = ImageToWork.RawFormat;
tbInfo.Text += string.Format("Resolution : {0}x{1} | Bits : {2:n0} | Format : {3}", ImageToWork.Width, ImageToWork.Height, ImageToWork.Width * ImageToWork.Height, GetFilenameExtension(Format));
}
}
private void btnSave_Click(object sender, EventArgs e)
{
#region Check Image
if (tbSourceImageFile.Text == "")
{
MessageBox.Show("File not selected. Select file first.");
return;
}
#endregion
#region Operations on image
Bitmap Image111 = new Bitmap(tbSourceImageFile.Text, true);
#region Progress Bar Settings
ProgressBar.Visible = true;
ProgressBar.Value = 1;
ProgressBar.Maximum = Image111.Width;
ProgressBar.Step = 1;
#endregion
if (cboxEnableScale.Checked == true)
{
int red, green, blue, red2=0, blue2=0, green2=0;
int scale = int.Parse(cbSelectorScale.SelectedItem.ToString());
for (int w = 0; w < Image111.Width; w++)
{
for (int h = 0; h < Image111.Height; h++)
{
Color PixelColor = Image111.GetPixel(w, h);
#region Quantization
red = PixelColor.R;
green = PixelColor.G;
blue = PixelColor.B;
Color newColor = Color.FromArgb(Valuator_v3(red, scale), Valuator_v3(green, scale), Valuator_v3(blue, scale));
Image111.SetPixel(w, h, newColor);
#endregion
}
ProgressBar.PerformStep();
}
}
#endregion
#region Saving
string SaveDirectory = tbSaveDestination.Text + '\\' + tbSaveFileName.Text + ".bmp";
SaveDirectory = tbSaveDestination.Text + '\\' + tbSaveFileName.Text + ".jpeg";
Image111.Save(SaveDirectory, System.Drawing.Imaging.ImageFormat.Png);
ProgressBar.Visible = false;
MessageBox.Show("Saved successfully.");
#endregion
}
Dans la région « Enregistrement » Je veux choisir quel filtre sera utilisé et de l'enregistrer à l'utiliser.
Un bon point de départ pourrait être de l'enregistrer * comme * un PNG en premier lieu plutôt qu'un Jpeg? 'Image111.Save (SaveDirectory, ImageFormat.Jpeg);'? Ensuite, vous appelez 'Save' une seconde fois et ne passez que le répertoire? – sab669
@ sab669 Oh, je faisais des tests et j'ai oublié de le changer. Bien sûr, enregistrer cette image ressemble à: 'Image111.Save (SaveDirectory, System.Drawing.Imaging.ImageFormat.Png);' –
Il y a un encodeur PNG [ici] (https://github.com/oltur/seeyourtravel.com/ blob/master/tools/WicResize/ThumbnailPNG.ashx) qui a [ces options de filtre] (https://github.com/oltur/seeyourtravel.com/blob/master/tools/WicResize/InteropServices/ComTypes/WinCodec.cs# L2409) – stuartd