ImageProcessor.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  2. using System.Drawing;
  3. using System.Drawing.Drawing2D;
  4. using System.Drawing.Imaging;
  5. using System.IO;
  6. using MediaBrowser.Common.Drawing;
  7. namespace MediaBrowser.Api
  8. {
  9. public static class ImageProcessor
  10. {
  11. public static void ProcessImage(Stream sourceImageStream, Stream toStream, int? width, int? height, int? maxWidth, int? maxHeight, int? quality)
  12. {
  13. Image originalImage = Image.FromStream(sourceImageStream);
  14. Size newSize = DrawingUtils.Resize(originalImage.Size, width, height, maxWidth, maxHeight);
  15. Bitmap thumbnail = new Bitmap(newSize.Width, newSize.Height, originalImage.PixelFormat);
  16. thumbnail.SetResolution(originalImage.HorizontalResolution, originalImage.VerticalResolution);
  17. Graphics thumbnailGraph = Graphics.FromImage(thumbnail);
  18. thumbnailGraph.CompositingQuality = CompositingQuality.HighQuality;
  19. thumbnailGraph.SmoothingMode = SmoothingMode.HighQuality;
  20. thumbnailGraph.InterpolationMode = InterpolationMode.HighQualityBicubic;
  21. thumbnailGraph.PixelOffsetMode = PixelOffsetMode.HighQuality;
  22. thumbnailGraph.CompositingMode = CompositingMode.SourceOver;
  23. thumbnailGraph.DrawImage(originalImage, 0, 0, newSize.Width, newSize.Height);
  24. Write(originalImage, thumbnail, toStream, quality);
  25. thumbnailGraph.Dispose();
  26. thumbnail.Dispose();
  27. originalImage.Dispose();
  28. }
  29. private static void Write(Image originalImage, Image newImage, Stream toStream, int? quality)
  30. {
  31. // Use special save methods for jpeg and png that will result in a much higher quality image
  32. // All other formats use the generic Image.Save
  33. if (ImageFormat.Jpeg.Equals(originalImage.RawFormat))
  34. {
  35. SaveJpeg(newImage, toStream, quality);
  36. }
  37. else if (ImageFormat.Png.Equals(originalImage.RawFormat))
  38. {
  39. newImage.Save(toStream, ImageFormat.Png);
  40. }
  41. else
  42. {
  43. newImage.Save(toStream, originalImage.RawFormat);
  44. }
  45. }
  46. private static void SaveJpeg(Image newImage, Stream target, int? quality)
  47. {
  48. if (!quality.HasValue)
  49. {
  50. quality = 90;
  51. }
  52. using (EncoderParameters encoderParameters = new EncoderParameters(1))
  53. {
  54. encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality.Value);
  55. newImage.Save(target, GetImageCodeInfo("image/jpeg"), encoderParameters);
  56. }
  57. }
  58. private static ImageCodecInfo GetImageCodeInfo(string mimeType)
  59. {
  60. ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();
  61. for (int i = 0; i < info.Length; i++)
  62. {
  63. ImageCodecInfo ici = info[i];
  64. if (ici.MimeType.Equals(mimeType, StringComparison.OrdinalIgnoreCase))
  65. {
  66. return ici;
  67. }
  68. }
  69. return info[1];
  70. }
  71. }
  72. }