2009-12-18 16 views
6

Mam plik obrazu, który jest 6k plik jpg o szerokości: 172 px i wysokość: 172px.C# dlaczego rozmiar obrazu zwiększy rozmiar pliku

używam kodu następujące próby zmiany rozmiaru go do pliku 128 * 128px jpg:

public static Image ResizeImage(Image img, int width, int height) 
    { 
     var b = new Bitmap(width, height, PixelFormat.Format24bppRgb); 

     using (Graphics g = Graphics.FromImage(b)) 
     { 
      g.DrawImage(img, 0, 0, width, height); 
     } 

     return b; 
    } 

Ten kod jest dziwnie zwiększył rozmiar pliku do 50k, może ktoś wyjaśnić, dlaczego? i jak zmienić rozmiar obrazu na 128 * 128 pikseli i zachować rozmiar około 6k.

Wielkie dzięki.

DY

+0

Jaki jest rozmiar pliku, jeśli pominiesz g.SmoothingMode = SmoothingMode.AntiAlias? – stuartd

+0

Przepraszam Stuart, co masz na myśli? –

+4

@DotNet User, dlaczego edytowałeś linię 'g.SmoothingMode = SmoothingMode.AntiAlias', a następnie zapytałeś @Stuart o co mu chodziło? Jego pytania wydają się całkiem jasne. – jball

Odpowiedz

11

To zależy od algorytmu, który został użyty do kompresji plików JPEG. Niektóre algorytmy są bardziej stratne (tracą jakość obrazu) niż inne, ale korzystają z mniejszego rozmiaru.

Co się dzieje, że w kodzie jpeg jest rozszerzany na mapę bitową w pamięci. Po zapisaniu jpeg 128x128, kod użył algorytmu, który mniej kompresuje niż ten użyty do zapisania oryginalnego obrazu. Spowodowało to, że wygenerował większy plik JPEG, mimo że sam rozmiar obrazu jest mniejszy.

+0

Witaj Santosc, dziękuję bardzo. Spędziłem na to całą noc. Czy podasz przykład, jak to ustawić? –

+0

Czy możesz pokazać kod, którego używasz do zapisania pliku z powrotem do jpeg? – santosc

+4

Oto artykuł, który pokazuje, jak programowo ustawić poziom kompresji JPEG: http://msdn.microsoft.com/en-us/library/bb882583.aspx – David

6

W zaksięgowanym kodzie nie zwracasz pliku JPEG, ale mapa bitowa (128x128 24bpp nieskompresowana mapa bitowa ma rozmiar 48kB). Musisz ponownie skompresować, this tutorial może pomóc.