Mam napisać program, który pobiera niektóre obrazy PNG od użytkownika, wykonuje proste zmiany, takie jak obracanie i zapisuje je w pliku JAR, aby mógł używać obrazów jako zasoby. Problem polega na tym, kiedy otwieram, powiedzmy obraz o wielkości 80kb, a następnie zapisz go przy pomocy C#, otrzymuję obraz o tej samej jakości, ale o przestrzeni 130kb. A ponieważ musi wejść do pliku J2ME jar, naprawdę potrzebuję mniejszych rozmiarów, przynajmniej oryginalnego rozmiaru. Próbowałem kodu poniżej, ale później okazało się, że działa tylko dla obrazów JPEG.C# - Jak zmienić jakość PNG lub głębię kolorów
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);
To gdzie obraz jest ładowany do skrzynki obrazku:
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;
}
}
I to jest, gdzie jest zapisywany z powrotem bez edycji:
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);
UWAGA: imageFileNames [] jest po prostu tablicą ciągów, która zawiera niektóre nazwy plików, do których obrazy muszą być zapisane.
Wszelkie pomysły zostaną docenione i z góry dziękujemy.
Czy zmienia się rozmiar pliku po ponownym zapisaniu obrazu bez wprowadzania zmian? –
Cześć Jacob, tak, robię. – Auxiliary
Czy widzimy kod, w którym ładujemy obraz i kod, w którym zapisujesz obraz? Nie widzę podobnego zachowania w moim (prostym) teście. –