2009-03-26 10 views
8

Ich habe sehr große Bilder (jpg) und ich möchte ein Csharp-Programm schreiben, um durch die Dateien zu loopen und die Größe jedes Bildes um 75% zu reduzieren.Erstellen Sie ein Vorschaubild und reduzieren Sie die Bildgröße

Ich versuchte dies:

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

aber die Dateigröße ist immer noch sehr groß.

Gibt es auf jeden Fall Thumbnails zu erstellen und die Dateigröße viel kleiner zu sein?

+0

reduzieren Welche Größe überschreiten Sie, dh was sind die Werte für Breite und Höhe? – dirkgently

+0

ich erstelle Dateien, die 800 x 600 sind – leora

Antwort

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)); 
} 

Verbrauch:

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

Das Test.jpg mit einer Qualität von 10 komprimiert werden, und es als Test2.jpg speichern.

EDIT: könnte als Erweiterung Methode besser sein:

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); 
} 

Verbrauch:

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

kann diese Funktion einen Bildtyp zurückgeben, da ich auf einer bestimmten Schnittstelle bleiben muss – leora

+0

Komprimierung findet statt, wenn die Datei gespeichert wird. Sie können Ihren GetThumbnailImage-Code weiterhin verwenden, aber anstatt Image.Save aufzurufen, sollten Sie Image.SaveCompressed aufrufen. AKAIK, Sie können ein Bildobjekt nicht direkt komprimieren und dann zurückgeben. –

+0

Sie müssen die Datei nicht in einer Datei speichern, da Sie sie in einem Speicherstream speichern und die Bitmap aus dem Speicherstream neu erstellen und den Stream anschließend verwerfen können. Auf diese Weise können Sie das 'Image' zurückgeben, während Sie es verkleinern. –

0

Komprimieren Sie Ihr Bild. Für Thumbnails ist JPEG ausreichend, da Sie nicht nach Qualität suchen.

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

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

Von GetThumbnailImage ‚s Dokumentation:

Wenn das Bild enthält ein eingebettetes thumbnail image ruft diese Methode das eingebettete Thumbnail ab und skaliert es die gewünschte Größe Wenn das Bild kein eingebettetes Miniaturbild enthält, erstellt diese Methode ein Miniaturbild, indem das Hauptbild skaliert wird.

Ich würde vorschlagen, dass Sie kleinere Breite und Höhe Werte verwenden. Versuchen Sie:

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

Siehe sample code.

Lesen Sie auch die Dokumentation:

Die GetThumbnailImage Methode funktioniert gut, wenn die angeforderte Thumbnail-Bild mit einer Größe von ca. 120 x 120 Pixel. Wenn Sie ein großes Miniaturbild (z. B. 300 x 300) von einem Bild mit einem eingebetteten Miniaturbild anfordern, kann dies zu einem deutlichen Qualitätsverlust des Miniaturbilds führen. Es ist möglicherweise besser, das Hauptbild zu skalieren (statt das eingebettete Miniaturbild zu skalieren), indem Sie die DrawImage-Methode aufrufen.

Ich denke, Sie möchten vielleicht einen Blick auf die Skalierungs-API werfen.

2

ImageMagick ist ein Befehlszeilentool, das sehr mächtig für die Bildbearbeitung ist. Ich habe es zur Größenanpassung großer Bilder und zur Erstellung von Miniaturansichten verwendet, wenn das Seitenverhältnis des Quellbildes unbekannt oder unzuverlässig ist. ImageMagick ist in der Lage, Bilder auf eine bestimmte Höhe oder Breite zu skalieren und dabei das ursprüngliche Seitenverhältnis Ihres Bildes beizubehalten. Es kann bei Bedarf auch Platz um ein Bild herum hinzugefügt werden. Alles in allem sehr leistungsfähig und eine nette Abstraktion vom Umgang mit .nets Image APIs.Zur Verwendung von ImageMagick Kommandozeilen-Tool innerhalb von C# Ich empfehle das System.Diagnostics.ProcessStartInfo-Objekt wie folgt:

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(); 

die Skala% Mit Paramater Sie bequem die Größe des Bildes um 75%