2009-03-26 16 views
8

Mam bardzo duże obrazy (jpg) i chcę napisać program csharp, aby przeglądać pliki i zmniejszyć rozmiar każdego obrazu o 75%.Utwórz miniaturę i zmniejsz rozmiar obrazu

Próbowałem to:

Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr()); 

ale rozmiar pliku jest nadal bardzo duże.

Czy istnieje jeszcze możliwość tworzenia miniatur i zmniejszania rozmiaru pliku?

+0

Jaki rozmiar przechodzisz, tj. Jakie są wartości szerokości i wysokości? – dirkgently

+0

Tworzę pliki o rozdzielczości 800 x 600 – leora

Odpowiedz

18
private void CompressAndSaveImage(Image img, string fileName, 
     long quality) { 
    EncoderParameters parameters = new EncoderParameters(1); 
    parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 
    img.Save(fileName, GetCodecInfo("image/jpeg"), parameters); 
} 

private static ImageCodecInfo GetCodecInfo(string mimeType) { 
    foreach (ImageCodecInfo encoder in ImageCodecInfo.GetImageEncoders()) 
     if (encoder.MimeType == mimeType) 
      return encoder; 
    throw new ArgumentOutOfRangeException(
     string.Format("'{0}' not supported", mimeType)); 
} 

Zastosowanie:

Image myImg = Image.FromFile(@"C:\Test.jpg"); 
CompressAndSaveImage(myImg, @"C:\Test2.jpg", 10); 

To będzie kompresować test.jpg z jakością 10 i zapisać go jako Test2.jpg.

EDIT: może być lepiej jako metodę rozszerzenia:

private static void SaveCompressed(this Image img, string fileName, 
     long quality) { 
    EncoderParameters parameters = new EncoderParameters(1); 
    parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 
    img.Save(fileName, GetCodecInfo("image/jpeg"), parameters); 
} 

Zastosowanie:

Image myImg = Image.FromFile(@"C:\Test.jpg"); 
myImg.SaveCompressed(@"C:\Test2.jpg", 10); 
+0

czy ta funkcja może zwrócić typ obrazu, ponieważ muszę zachować określony interfejs – leora

+0

Kompresja ma miejsce, gdy plik zostanie zapisany. Nadal możesz używać swojego kodu GetThumbnailImage, ale zamiast wywoływać Image.Save, powinieneś zadzwonić do Image.SaveCompressed. AKAIK, nie można bezpośrednio skompresować obiektu Image, a następnie go zwrócić. –

+0

Nie trzeba zapisywać w pliku, ponieważ można go zapisać w strumieniu pamięci i odtworzyć bitmapę ze strumienia pamięci, a następnie odrzucić strumień. W ten sposób możesz zwrócić 'Obraz' przy jednoczesnym zmniejszeniu jego rozmiaru. –

0

Skompresuj swój obraz. W przypadku miniaturek JPEG wystarcza, ponieważ nie szukasz jakości.

Image thumbNail = image.GetThumbnailImage(800, 600, null, new IntPtr()); 

thumbNail.Save(fileName, ImageFormat.Jpeg); 
0

Z dokumentacji GetThumbnailImage „s:

Jeśli obraz zawiera wbudowany miniatura, ta metoda pobiera osadzoną miniaturę i skaluje ją żądany rozmiar. Jeśli obraz nie zawiera osadzonej miniatury, ta metoda tworzy miniaturę poprzez skalowanie głównego obrazu.

Proponuję użyć mniejszych wartości szerokości i wysokości. Wypróbuj:

// reduce the size of each image by 75% from original 800x600 
Image thumbNail = image..GetThumbnailImage(200, 150, null, IntPtr.Zero); 

Zobacz kod sample.

Przeczytaj także dokumentację:

Sposób GetThumbnailImage działa dobrze, gdy żądana miniatura ma wymiary około 120 x 120 pikseli. Jeśli zażądasz dużego obrazu miniatury (na przykład 300 x 300) z obrazu z osadzoną miniaturą, może wystąpić zauważalna utrata jakości na obrazie miniaturki. Lepiej może przeskalować obraz główny (zamiast skalować osadzoną miniaturę), wywołując metodę DrawImage.

Myślę, że warto rzucić okiem na API skalowania.

2

ImageMagick to narzędzie linii poleceń, które ma ogromne możliwości manipulowania obrazem. Używałem go do zmiany rozmiaru dużych obrazów i tworzenia miniatur w okolicznościach, w których proporcje obrazu źródłowego są nieznane lub nie są wiarygodne. ImageMagick jest w stanie zmienić rozmiar obrazu na określoną wysokość lub szerokość, zachowując oryginalne proporcje obrazu. W razie potrzeby może również dodać przestrzeń wokół obrazu. W sumie bardzo potężna i miła abstrakcja z konieczności radzenia sobie z API .nets Image.Aby użyć narzędzia wiersza polecenia ImageMagick z poziomu C# Polecam używanie przedmiotem System.Diagnostics.ProcessStartInfo tak:

ProcessStartInfo psi = new ProcessStartInfo(); 
psi.FileName = @"C:\Program Files\ImageMagick-6.5.0-Q16\convert.exe"; 
psi.UseShellExecute = false; 
psi.RedirectStandardOutput = true; 
psi.RedirectStandardError = true; 
psi.Arguments = string.Format("-size x{0} \"{1}\" -thumbnail 200x140 -background transparent -gravity center -extent 200x140 \"{2}\"", heightToResizeTo, originalTempFileLocation, resizedTempFileLocation); 

Process p = new Process(); 
p.StartInfo = psi; 
p.Start(); 
p.WaitForExit(); 

Stosując skalę% paramater można łatwo zmniejszyć rozmiar obrazu o 75%

Powiązane problemy