Autor Wątek: Dobieranie palety obrazka.  (Przeczytany 1681 razy)

Offline Adam B

  • Użytkownik

# Sierpień 07, 2009, 20:36:35
Witam,
Mam pewien problem związany z paletą obrazka:
 - Wczytuje obrazek w formacie png o palecie, która posiada mniej niż 256 kolorów.
 - Następnie przeskalowuje obrazek w ten sposób:
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
- kolejno zapisuje obrazek:
output.Save(x.png);

Generalnie po tych operacjach paleta się (chyba) zmienia. A na pewno zmienia się rozmiar obrazka w KB. Zależało by mi na tym żeby obrazek był zapisany w postaci takiej w jakiej został wczytany - czyli kolory indeksowane.

próbowałem też wczytać zaraz po załadowaniu obrazka jego paletę:
System.Drawing.Imaging.ColorPalette Paleta = bufor.Palette;
a po wykonaniu opcji przeskalowania podstawiać do obrazka tą paletę, ale niestety to nie zmieniło palety:/

Pozdrawiam

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline mykhaylo

  • Użytkownik
    • Wings of Fury 2

# Sierpień 09, 2009, 13:38:53
A próbowałeś podać w drugim parametrze typ zapisywanego obrazka ?
Kod: (csharp) [Zaznacz]
image.Save(@"j:\p.png", ImageFormat.Png);

Offline Adam B

  • Użytkownik

# Sierpień 10, 2009, 16:59:35
A próbowałeś podać w drugim parametrze typ zapisywanego obrazka ?
Kod: (csharp) [Zaznacz]
image.Save(@"j:\p.png", ImageFormat.Png);

Niestety coś takiego nie pomaga :/

Offline mykhaylo

  • Użytkownik
    • Wings of Fury 2

# Sierpień 10, 2009, 19:32:49
Możesz podać przykładowy plik na którym testujesz? Skalujesz: to znaczy zwiększasz czy zmniejszasz rozmiar obrazka ?

Offline Adam B

  • Użytkownik

# Sierpień 11, 2009, 10:22:20
obraz png obojętnie jakie w photoshopie zapisany do palety 256 kolorów.
obrazy są pomniejszane.

        //Skaluje obraz o dany procent
        private Bitmap resizeImageP(Bitmap B, float P)
        {
            int destWidth = (int)((float)B.Width * P) + 1;
            int destHeight = (int)((float)B.Height * P) + 1;

            Bitmap output = new Bitmap(destWidth, destHeight);

            Graphics g = Graphics.FromImage(output);
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
            g.DrawImage(B, 0, 0, destWidth, destHeight);
            g.Dispose();
            //Ustawienie palety
            output.Palette = Paleta; <- niestety to nic nie daje. a przynajmniej obrazek nie jest zapisany w trybie kolorów indeksowanych z paletą 256 kolorów czyli 8-bitów na piksel.
            return output;
        }

wgląda to mniejwięcej tak jak wyżej.

Offline Adam B

  • Użytkownik

# Sierpień 28, 2009, 19:15:48
Może ktoś ma jakieś informacje o bibliotekach, które mogą optymalizować png w c# net.?
Wiem że obrazek jest zapisany w głębi 8 bitowej, i chce go tak zapisać - czyli wczytuje obrazek do pamięci i chce go zapisać - tylko że gdy zapisuje to jego rozmiar się zwiększa bo zapisuje go w pełnej palecie...

Pozdrawiam :)

Offline Adam B

  • Użytkownik

# Sierpień 29, 2009, 10:49:59
Może ktoś ma jakieś informacje o bibliotekach, które mogą optymalizować png w c# net.?
Wiem że obrazek jest zapisany w głębi 8 bitowej, i chce go tak zapisać - czyli wczytuje obrazek do pamięci i chce go zapisać - tylko że gdy zapisuje to jego rozmiar się zwiększa bo zapisuje go w pełnej palecie...

Pozdrawiam :)

Zmieniłem całkowicie podejście:

Wcześniej wczytywałem obrazek i go zapisywałem jako obrazek.
Teraz program nie wie co wczytuje - wczytuje ciąg bitów do tablicy i potem tę tablicę zapisuje - nie działa więc żaden algorytm do zapisywania obrazka - działam bezpośrednio na Streamie więc teraz rozmiar tego co zapisuje jest zależny już tylko od tego co wczytam. Więc jak mam przygotowany wcześniej obrazek w palecie 8 czy 4 bitowej to tak samo to zapisze ;)

Tracie się przez to łatwą modyfikację zawartości obrazka no ale coś za coś...