2012-06-21 15 views
5

Obrazy, które są świeże z aparatów cyfrowych, często przekraczają rozmiar 2-3 MB, co utrudnia ich przesłanie pocztą e-mail i innymi sposobami. Wymaga to zmiany rozmiaru obrazu (pod względem rozmiaru pliku, a nie wysokości lub szerokości). Zupełnie podobny do MS Paint oferującego funkcję zmiany rozmiaru obrazu. Nie jestem dobrze wykształcony w teorii plików obrazów. Będę wdzięczny, jeśli ktoś może mi punkt w kierunku następujących źródeł informacji:Zmiana rozmiaru obrazu za pomocą C#

  • teorii obrazu (jak różne formaty obrazu pracować JPEG, PNG, TIFF itp.)?

  • W jaki sposób obraz traci ostrość po zmianie rozmiaru? Czy istnieje jakiś wolny dostęp .Net (korzystam z wersji 4.0) dostępnych do wykonania tej operacji? Czy są dostępne jakieś bezpłatne biblioteki .NET (używam wersji 4.0)? Jeśli nie, czy mogę korzystać z dowolnej biblioteki korzystającej ze współdziałania com?

Dziękujemy,

+0

Przeczytaj na "kwantyzacji kolorów" http://en.wikipedia.org/wiki/Color_quantization – BryanJ

+0

Bitmap (image, szerokość, wysokość) konstruktora wykonuje dość wiarygodną pracę bez większego zamieszania. –

+0

Kiepska jakość, chociaż. –

Odpowiedz

24

zmiana rozmiaru obraz jest funkcjonalność jest wbudowana w .NET Framework. Istnieje kilka różnych sposobów:

  • GDI +
  • WIC
  • WPF

Oto miły blog post pokrycie różnic między nimi.

Oto przykład z GDI +:

public void Resize(string imageFile, string outputFile, double scaleFactor) 
{ 
    using (var srcImage = Image.FromFile(imageFile)) 
    { 
     var newWidth = (int)(srcImage.Width * scaleFactor); 
     var newHeight = (int)(srcImage.Height * scaleFactor); 
     using (var newImage = new Bitmap(newWidth, newHeight)) 
     using (var graphics = Graphics.FromImage(newImage)) 
     { 
      graphics.SmoothingMode = SmoothingMode.AntiAlias; 
      graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 
      graphics.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight)); 
      newImage.Save(outputFile); 
     } 
    } 
} 
+0

Dzięki Darin. Nie chcę wspominać o szerokości i wysokości w liczbach. Raczej będą one wymienione w procentach. Aby tego użyć, będę musiał (prawdopodobnie) obliczyć szerokość wysokości istniejących obrazów. – James

+0

Tak, możesz to zrobić po załadowaniu 'srcImage'. Między pierwszą a drugą instrukcją 'using'. Możesz użyć srcImage.Width i srcImage.Height do obliczenia wartości newWidth i newHeight przekazanych do konstruktora Bitmap. –

+0

Zaktualizowałem swój post na przykładzie. –

7

użyłem przykładu dostarczonego przez Darin Dimitrov, Obraz został nadmuchany do i zajął się dużo miejsca na dysku (od 1,5 MB do 17MB lub więcej).

Jest to spowodowane małym błędem w ostatnim wierszu kodu.

Poniższa funkcja zapisuje obraz jako bitmapę (duży rozmiar obrazu).

newImage.Save(outputFile) 

Prawidłowa funkcja powinna być:

newImage.Save(outputFile, ImageFormat.Jpeg); 
Powiązane problemy